Fix race condition in BUILD_SHARED_LIBS configs.
Duplicate the ASM custom build rules: build each ASM object
once for each library. This avoids creating a race condition
on the output objects for the assembly custom build rules
when building the static and shared libraries from the same
configuration.
BUG=aomedia:3214
Change-Id: I8c7c44d26ffc1b6c2b9fe2556bf9da800d90c496
(cherry picked from commit 4d5b12223a416ffaea17297c7c6c596e205ff375)
diff --git a/aom_ports/aom_ports.cmake b/aom_ports/aom_ports.cmake
index b4cceb7..5d9f69a 100644
--- a/aom_ports/aom_ports.cmake
+++ b/aom_ports/aom_ports.cmake
@@ -45,6 +45,7 @@
function(setup_aom_ports_targets)
if(WIN32 AND "${AOM_TARGET_CPU}" STREQUAL "x86_64")
add_asm_library("aom_ports" "AOM_PORTS_ASM_X86")
+ set(aom_ports_asm_lib 1)
set(aom_ports_has_symbols 1)
elseif("${AOM_TARGET_CPU}" MATCHES "arm")
add_library(aom_ports OBJECT ${AOM_PORTS_SOURCES_ARM})
@@ -67,7 +68,16 @@
# libaom_srcs.*; if it becomes necessary for a particular generator another
# method should be used.
if(aom_ports_has_symbols)
- target_sources(aom_ports PRIVATE ${AOM_PORTS_INCLUDES})
+ if(aom_ports_asm_lib)
+ # When aom_ports is an asm library its name changes based on build
+ # configuration. This handles adding sources to the correct target(s).
+ target_sources(aom_ports_static PRIVATE ${AOM_PORTS_INCLUDES})
+ if(BUILD_SHARED_LIBS)
+ target_sources(aom_ports_shared PRIVATE ${AOM_PORTS_INCLUDES})
+ endif()
+ else()
+ target_sources(aom_ports PRIVATE ${AOM_PORTS_INCLUDES})
+ endif()
set(AOM_LIB_TARGETS ${AOM_LIB_TARGETS} PARENT_SCOPE)
else()
target_sources(aom PRIVATE ${AOM_PORTS_INCLUDES})
diff --git a/build/cmake/aom_optimization.cmake b/build/cmake/aom_optimization.cmake
index 9c2afe9..0203165 100644
--- a/build/cmake/aom_optimization.cmake
+++ b/build/cmake/aom_optimization.cmake
@@ -130,47 +130,59 @@
# into the aom library target(s). Generates a dummy C file with a dummy function
# to ensure that all cmake generators can determine the linker language, and
# that build tools don't complain that an object exposes no symbols.
+#
+# In shared library configs every step described above happens twice, and
+# directory/target/object names are updated to include _shared and _static
+# suffixes.
function(add_asm_library lib_name asm_sources)
if("${${asm_sources}}" STREQUAL "")
return()
endif()
- set(asm_lib_obj_dir "${AOM_CONFIG_DIR}/asm_objects/${lib_name}")
- if(NOT EXISTS "${asm_lib_obj_dir}")
- file(MAKE_DIRECTORY "${asm_lib_obj_dir}")
+
+ list(APPEND asm_configs "static")
+ if(BUILD_SHARED_LIBS)
+ list(APPEND asm_configs "shared")
endif()
- # TODO(tomfinegan): If cmake ever allows addition of .o files to OBJECT lib
- # targets, make this OBJECT instead of STATIC to hide the target from
- # consumers of the AOM cmake build.
- add_library(${lib_name} STATIC ${${asm_sources}})
- set_property(TARGET ${lib_name} PROPERTY FOLDER ${AOM_TARGET_CPU})
-
- foreach(asm_source ${${asm_sources}})
- get_filename_component(asm_source_name "${asm_source}" NAME)
- set(asm_object "${asm_lib_obj_dir}/${asm_source_name}.o")
- add_custom_command(OUTPUT "${asm_object}"
- COMMAND ${AS_EXECUTABLE} ARGS ${AOM_AS_FLAGS}
- -I${AOM_ROOT}/ -I${AOM_CONFIG_DIR}/ -o
- "${asm_object}" "${asm_source}"
- DEPENDS "${asm_source}"
- COMMENT "Building ASM object ${asm_object}"
- WORKING_DIRECTORY "${AOM_CONFIG_DIR}"
- VERBATIM)
- target_sources(aom PRIVATE "${asm_object}")
- if(BUILD_SHARED_LIBS)
- target_sources(aom_static PRIVATE "${asm_object}")
+ foreach(asm_config ${asm_configs})
+ set(asm_lib_name ${lib_name}_${asm_config})
+ set(asm_lib_obj_dir "${AOM_CONFIG_DIR}/asm_objects/${asm_lib_name}")
+ if(NOT EXISTS "${asm_lib_obj_dir}")
+ file(MAKE_DIRECTORY "${asm_lib_obj_dir}")
endif()
+
+ add_library(${asm_lib_name} STATIC ${${asm_sources}})
+ set_property(TARGET ${asm_lib_name} PROPERTY FOLDER ${AOM_TARGET_CPU})
+
+ foreach(asm_source ${${asm_sources}})
+ get_filename_component(asm_source_name "${asm_source}" NAME)
+ set(asm_object "${asm_lib_obj_dir}/${asm_source_name}.o")
+ add_custom_command(OUTPUT "${asm_object}"
+ COMMAND ${AS_EXECUTABLE} ARGS ${AOM_AS_FLAGS}
+ -I${AOM_ROOT}/ -I${AOM_CONFIG_DIR}/ -o
+ "${asm_object}" "${asm_source}"
+ DEPENDS "${asm_source}"
+ COMMENT "Building ASM object ${asm_object}"
+ WORKING_DIRECTORY "${AOM_CONFIG_DIR}"
+ VERBATIM)
+ if(BUILD_SHARED_LIBS AND "${asm_config}" STREQUAL "static")
+ target_sources(aom_static PRIVATE "${asm_object}")
+ else()
+ target_sources(aom PRIVATE "${asm_object}")
+ endif()
+ endforeach()
+
+ # The above created a target containing only ASM sources. CMake needs help
+ # here to determine the linker language. Add a dummy C file to force the
+ # linker language to C. We don't bother with setting the LINKER_LANGUAGE
+ # property on the library target because not all generators obey it (looking
+ # at you, Xcode generator).
+ add_dummy_source_file_to_target("${asm_lib_name}" "c")
+
+ # Add the new lib target to the global list of aom library targets.
+ list(APPEND AOM_LIB_TARGETS ${asm_lib_name})
endforeach()
- # The above created a target containing only ASM sources. Cmake needs help
- # here to determine the linker language. Add a dummy C file to force the
- # linker language to C. We don't bother with setting the LINKER_LANGUAGE
- # property on the library target because not all generators obey it (looking
- # at you, xcode generator).
- add_dummy_source_file_to_target("${lib_name}" "c")
-
- # Add the new lib target to the global list of aom library targets.
- list(APPEND AOM_LIB_TARGETS ${lib_name})
set(AOM_LIB_TARGETS ${AOM_LIB_TARGETS} PARENT_SCOPE)
endfunction()