Skip to content

Commit 2bfd038

Browse files
[arccon] Add optional dotnet wrapper to prevent first time use race condition.
The wrapper is only used on Unix environment and may be disabled when setting CMake variable ARCCON_NO_WRAPPER_FOR_DOTNET.
1 parent a780c35 commit 2bfd038

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

arccon/build-system/ArcconDotNet.cmake

+21-2
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,34 @@ set(ARCCON_MSBUILD_COMMON_ARGS /nodeReuse:false ${ARCCON_MSBUILD_RESTORE_ARGS})
2222
find_program(DOTNET_EXEC NAMES dotnet)
2323
message(STATUS "[.Net] DOTNET exe: ${DOTNET_EXEC}")
2424
if (DOTNET_EXEC)
25+
# Avec '.Net' (au moins pour les versions 6 à 8), il y a un conflit
26+
# potentiel de lock sur les fichiers lors d'une premier appel de 'dotnet'
27+
# si plusieurs instances sont lancées à la fois
28+
# (voir par exemple https://github.com/dotnet/runtime/issues/91987 ou
29+
# https://github.com/dotnet/runtime/issues/80619)
30+
# Pour éviter cela, on créé un wrapper à 'dotnet' qui utilise un HOME local
31+
# au projet et on utiliser ce wrapper
32+
if (UNIX AND NOT ARCCON_NO_WRAPPER_FOR_DOTNET)
33+
set(ARCCON_DOTNET_FAKEHOME "${CMAKE_CURRENT_BINARY_DIR}/fakehome")
34+
set(ARCCON_DOTNET_WRAPPER "${ARCCON_DOTNET_FAKEHOME}/arccon_dotnet")
35+
cmake_path(GET DOTNET_EXEC PARENT_PATH ARCCON_DOTNET_PATH)
36+
file(MAKE_DIRECTORY ${ARCCON_DOTNET_FAKEHOME})
37+
configure_file(${CMAKE_CURRENT_LIST_DIR}/arccon_dotnet.in ${ARCCON_DOTNET_WRAPPER} USE_SOURCE_PERMISSIONS @ONLY)
38+
message(STATUS "Using wrapper '${ARCCON_DOTNET_WRAPPER}' for '${DOTNET_EXEC}'")
39+
set(DOTNET_EXEC_WRAPPER "${ARCCON_DOTNET_WRAPPER}")
40+
else()
41+
set(DOTNET_EXEC_WRAPPER "${DOTNET_EXEC}")
42+
endif()
43+
2544
set(ARCCON_DOTNET_HAS_RUNTIME_coreclr TRUE)
26-
set(ARCCON_MSBUILD_EXEC_coreclr ${DOTNET_EXEC})
45+
set(ARCCON_MSBUILD_EXEC_coreclr ${DOTNET_EXEC_WRAPPER})
2746
# Pour les options, voir le CMakeLists.txt de 'axlstar'
2847
set(ARCCON_MSBUILD_ARGS_coreclr publish /p:UseSharedCompilation=false ${ARCCON_MSBUILD_COMMON_ARGS})
2948
# Arguments pour fabriquer les packages NuGet
3049
set(ARCCON_DOTNET_PACK_ARGS_coreclr pack --no-build --no-restore --no-dependencies /nodeReuse:false)
3150

3251
# Récupère le numéro de version 'dotnet'
33-
execute_process(COMMAND ${DOTNET_EXEC} "--version" OUTPUT_VARIABLE CORECLR_EXEC_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE)
52+
execute_process(COMMAND ${DOTNET_EXEC_WRAPPER} "--version" OUTPUT_VARIABLE CORECLR_EXEC_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE)
3453
string(REGEX MATCH "([0-9]+)\.([0-9]+)\.(.*)" CORECLR_VERSION_REGEX_MATCH ${CORECLR_EXEC_VERSION_OUTPUT})
3554
set(CORECLR_VERSION ${CMAKE_MATCH_1}.${CMAKE_MATCH_2})
3655
set(CORECLR_VERSION_FULL ${CORECLR_VERSION}.${CMAKE_MATCH_3})

arccon/build-system/arccon_dotnet.in

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/bin/sh
2+
export HOME=@ARCCON_DOTNET_FAKEHOME@
3+
# To disable telemetry
4+
export DOTNET_CLI_TELEMETRY_OPTOUT=1
5+
6+
@ARCCON_DOTNET_PATH@/dotnet "$@"

0 commit comments

Comments
 (0)