From 9fe47e548501adc1b2e0afa8d8ab8607aea4dfd6 Mon Sep 17 00:00:00 2001 From: Stefan Reimer Date: Wed, 26 Nov 2014 00:47:11 -0800 Subject: [PATCH] app-emulation/wine: Version bump 1.7.30 to fix regressions --- app-emulation/wine/Manifest | 8 +- .../wine/files/wine-1.7.12-osmesa-check.patch | 38 ++ .../wine/files/wine-1.7.28-gstreamer-v4.patch | 629 ++++++++++++++++++ ...ne-1.7.11-r1.ebuild => wine-1.7.30.ebuild} | 291 ++++---- 4 files changed, 847 insertions(+), 119 deletions(-) create mode 100644 app-emulation/wine/files/wine-1.7.12-osmesa-check.patch create mode 100644 app-emulation/wine/files/wine-1.7.28-gstreamer-v4.patch rename app-emulation/wine/{wine-1.7.11-r1.ebuild => wine-1.7.30.ebuild} (54%) diff --git a/app-emulation/wine/Manifest b/app-emulation/wine/Manifest index 8c7e594..8217cb0 100644 --- a/app-emulation/wine/Manifest +++ b/app-emulation/wine/Manifest @@ -8,12 +8,14 @@ AUX wine-1.5.26-winegcc.patch 1808 SHA256 91c1012059b93a421b2eae9f2ea46b7b327d6d AUX wine-1.5.30-libwine.patch 1777 SHA256 2f0155c2c1d11fd9a06deab54dd753c1161e32217eae82604f8c1d542e87af4f SHA512 e6d566f75632065def197cf27b5705a3f2f736a7b3bb4ae03df19fea00fd980a5b5d0517981469fef0fa5347c1c3b9651894fb23d937b5dbbd993cd292f67183 WHIRLPOOL 62ed15db6bddda47dcf74d846e15a9904c11abdf63e0321e7e2bc3197f60c819992b3a95a4395f85edeef9181a1866749194b9744be8d42bd94acab37470aad6 AUX wine-1.5.31-gnutls-3.2.0.patch 1616 SHA256 3ce82009b05fe997b0d198ad83533026d6410811ecfc6254c1505d0b9d18caf0 SHA512 09de6ff03da996197cd6833c1f53e9f39b43fc43e02ad3b4e12648a57288c1fa200886a805e6811372e12665f9a5d463603f9a9ba39cb1392b2cf4d11f3f9a65 WHIRLPOOL 590a9206913a51eae81e236057bbed346dae8f895575dcc948ba7168edf5c0605db6278344fad727c2a828a2aeef258f72a57a12b5dca244a3b7b82cfe43452a AUX wine-1.6-memset-O3.patch 695 SHA256 1f04496713e8a401ba068702c5c3e104b18635bfb54808e5641a3c48a9b9bad4 SHA512 ad7231f8dedf98f9e9b91fcb8bbe72a716d78285127b0c33396de0b1e17a191f91f9a4a377c0e90671bb5f4e57bfb087ef7e80c9537c6c73b3c9bb90b3885968 WHIRLPOOL 91689c31054b896609493e2b0b4fe67e3d752d889f4ccae9c3e15229543341998809fd19a2040457e04fbdbd45505f0f2b49052844004193872713053d7239f8 +AUX wine-1.7.12-osmesa-check.patch 1722 SHA256 42648efa15040011ef868f92fd615924a83b5a30dab25505928226d8bc48159d SHA512 faca80f9747f3d7bfd05c3410bcccfaf17b3f397e30dd9ec382eccc326de346d195d6a184ec78e44b26d5e5e4b2af749ce58a0e6bad0b15a4fd1f2ea610d3124 WHIRLPOOL c5314849d15a53dc00af80f44249c10107b17825c4a2ab4510a5799b154bb1cdb516b3b632e1e959802588f673b9eac8ed6de2dfb59bde34acdd5b752115f695 AUX wine-1.7.2-osmesa-check.patch 1740 SHA256 5264ac291435eb64c70cef4bdccbf8d4448472b4f014ab15ede35bcceebb6579 SHA512 4738a381923df7b45ea68092efb7ccb967907976d6d2f8bb0167af4211c377a73e296481b94092ac232f9ae09edf21447da92a134ebfff9b32acdd9e20340b95 WHIRLPOOL 95a90f8ff5a649833b39cb28de997c3b516cd09a53cf71d616c4fd412dfa6e71c47a1255a4d0597d85a62966cd9d6b9fae1c21c88e67d8650d31d414fca8fd42 +AUX wine-1.7.28-gstreamer-v4.patch 19689 SHA256 9d621741a9909973bfbd28f07b4e2eb54813d0a5d2ff10d6550f7097aff36590 SHA512 383f588f40d9efaa653c3fa326692c36df02de382729b939d04d085c28f388cc0d8c7fac49671a2045f095bf624e2be6f9de6a064e9d9e606db07b2b61b1329f WHIRLPOOL 9078e8966c1777376a077f5a636c1997b33b26150a4a4efdae472c22e0d97c572c7ce34825a98b1e5240c08dc504fea6442c9e3c193a38ea8b75bccd4c56fc77 AUX wine-1.7.9-hcce.patch 4699 SHA256 93d5dd444f3cd445156d21dad8653ad67d195cd8c373335d43b122e68e76e673 SHA512 084fd9af46acdb035e3ec4bcdeb04cb21a09c4288777905136f8bfe74ee14833a3cee241be891ceca9c70e0a506d936d92d12422c54d1a2e211c0dbe128f98bc WHIRLPOOL ccc3fa16bf5ef0f7e1b227d0c35b4dae986a30b2a99ae2fbccff1416feac6bd6ade389d900882daa86a16e1209e977b212f33e227a5beb355d9cde2a6df1badb -DIST wine-1.7.11.tar.bz2 21359534 SHA256 c07d2771ed96c45d428bb11d164c5e4bbe48d6857a0a4cba2e0b73c5f1044f93 SHA512 9743c4cf382b6846d98aa383d9db22cb99bca510ec2db3e9224f10d08095c4a3fe4449b3019d5a6f401458a98696d096a454d00584c667074aed618c47544dcf WHIRLPOOL 38356b5df2c9f5a78b9eb66c6e0f09f7371c57d84f601e6614228b64c629a2c9c222696078d7627df850792a0111e7876fe460c4575bac4accf2f56a391315c6 +DIST wine-1.7.30.tar.bz2 21835863 SHA256 10f7caf0420970772d868ab2ae24578f89b8a04b93604473e7c41bb295e0086c SHA512 d9b20fa58b353e60ebee930c969da10618e2aca8aba530f1d31ee315e1e3e5d4c495998e59cccbfeb6452811a5c8e360c76b9ec2ae0e16a987a197a559d1f954 WHIRLPOOL 2d5a0c00d356f0960c89e162080e7b67a63ee40439b7b2e8b3774b85ecef9406ffce7cbf9b9941856c9f97f542fa34a5610607307623b07b677991710c7d92e4 DIST wine-gentoo-2013.06.24.tar.bz2 85442 SHA256 bfbf6b25e98f717320de2ede467e3628fbc749d936b8449f8477c9dc6f41e04b SHA512 b6819889314f6a6ea16c1332f4b177c43623116763969c31b23b61754cd304dd085f5d3eafbe847159331eb97dddd9b4c10699430129ea4a71da418c1fe175f0 WHIRLPOOL 227e0ac6569736d4ad5813cef49f775dae956f4fc9255de95753d5d3cba1bf6cf3db31d23d3702bb54d2e60c5a6f779b602f0efb2096e4c827c924565b273d00 DIST wine-mono-4.5.2.msi 52502528 SHA256 d9124edb41ba4418af10eba519dafb25ab4338c567d25ce0eb4ce1e1b4d7eaad SHA512 73c907f63b73836d5afd0753197358aaea43a74a47800f929ef0627112298256f1fa46d1b9ff297b117468d953cdeab21fb5962db13c5debbcb71004462df609 WHIRLPOOL 18d3544c6753c5a01917bfc1b694f31ce45213108527f13317ec0bb8b2d2339ce41800534967e067cd15cd186ef9e186a5d3252275e443dfa1a6ae3641d4d17c +DIST wine-staging-1.7.30.tar.gz 8439935 SHA256 42d761cde615c5d70656078a7c2b23cf1e57f7ba174b3e6c9da6de876bc268d2 SHA512 b0dc44e6ca75f0578a7a76682b3a4acd369a18ed57d0b3bfa95c4416ed31e2630bbdf9f83e98db8b39e2f5b5fc745259af57fcc09de51b37e5e4184cbd71fd0c WHIRLPOOL f4fe5253b5c2579e342f863a0e07df872a2876a67413fa07ab61f66d32b04537e57c952e7017905fd5febad7797173aaf38132b3c067ef5068b87e74acf1ca64 DIST wine_gecko-2.24-x86.msi 22373888 SHA256 6e38acae87ea66e2c1e8f2f0afe88f89eed3e6e0b431cd3da38dea814b71202c SHA512 f158d28ca09bc900a2680892e7ac10770e06050a9251e1ec3a953fee0bf9b1c326e166f92fb88a4648297b6587c91a5ef5af35f267bb2ba5f679da4c8fdb6898 WHIRLPOOL bbe7a2572d89dc5e0347ba11b2014bac79fc4427d7551655313a46b147a79c1607b7f46596877c459ddaa0e202337fb3d217429ddd6a4df49ee33b373a788487 DIST wine_gecko-2.24-x86_64.msi 23608320 SHA256 47557da68bcb2aedaebb93af73275aac96ba23e896bd98f25f2acbfd216d9cc8 SHA512 45ce0dcf42c3e2fe2198092812242e3467b19db4a4946e0b1a2d6327fd48aa936fb85cc1930bace6eaba0c61bff3a6536767ba0a91a0f085f307d1bddd171f0c WHIRLPOOL b6ba7c784d3a79d7afc11f0e12f0372b52b9f194eedfd083abed36a461e7301d2dd936be3be12619364f6ac5aae9cfbfb7fc47141bff92b62826f209365210ec -DIST winepulse-patches-1.7.10.tar.bz2 49205 SHA256 7330b4552b572244bbe99c16005d725eaf382995c986add170474381b90df468 SHA512 ef3a5477bc5803bfba609dc3299a7c07833958628d1aff01d100da57c0d270344ee326649206708c50c2a12b025f987a4e0f1dee9126e52e2778b256c45ba567 WHIRLPOOL b40088d8665f3cc57b4936774ac6dc2e6b005d75aa7c7385248ce35e5cf6e168ae212771f771b68dbf91fc5034b7ba54f907e93283cc2eddaa18e825d9b734a9 -EBUILD wine-1.7.11-r1.ebuild 12802 SHA256 9f588b795c882e25e343f09b14d3def3f864c8bb778ed8a169c7f686838ad78f SHA512 5b2e5edd5d1990a4860af333fc58c5f059ded3ad8e7fdb8bf69549dd45b1d4fd5e5d64f5f24cd34e48260265009ae61e71c9e6de3ed176165e1e28094f6dedb9 WHIRLPOOL 02827b60b5f46acec1c467a58a270d8917f62f9097cc5fb6d567a698c422cbfa4553fc32f17acfd5ec9571addebb0a07fab55844e3085cf2e52677f4a9028d0c +EBUILD wine-1.7.30.ebuild 15473 SHA256 a65a860f35b89492d535d52fa1951d91034bf0e71ec4bbf740afc98bcf907242 SHA512 cad207131d2631a9236954122655803543a3f44aca3a84aff6a6866ad900417078ac495ba1baff4baaa0b22d704a4007f1003de3753bd863cb613424302daf54 WHIRLPOOL fbdd9275d06cccab7cbb39ce81719346fa679563e715466517c9e231903b7061d3cb53c98925cad74b5d4d19bad39c36c531056d6ed002fe867a4bd863e57453 diff --git a/app-emulation/wine/files/wine-1.7.12-osmesa-check.patch b/app-emulation/wine/files/wine-1.7.12-osmesa-check.patch new file mode 100644 index 0000000..7cafcd4 --- /dev/null +++ b/app-emulation/wine/files/wine-1.7.12-osmesa-check.patch @@ -0,0 +1,38 @@ +From 6932b9a17c4f64c13f7060895d46334bc7022430 Mon Sep 17 00:00:00 2001 +From: Alexandre Rostovtsev +Date: Tue, 7 Aug 2012 01:29:01 -0400 +Subject: [PATCH] Do not check for libGL symbols when checking libOSMesa + +If mesa had been built with shared glapi, glAccum is not available in +libOSMesa without explicitly linking to libGL. In addition, in +mesa-8.0.x and earlier, libOSMesa needs to be explicitly linked to +libglapi if mesa was built with shared glapi, see +https://bugs.gentoo.org/show_bug.cgi?id=399813 +And in mesa-8.1.x, libOSMesa in addition needs libdl, libpthread, and +libstdc++, see https://bugs.gentoo.org/show_bug.cgi?id=431832 +--- + configure.ac | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index de807d2..a2e8684 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1233,7 +1233,13 @@ This probably prevents linking to OpenGL. Try deleting the file and restarting c + + if test "x$with_osmesa" != "xno" + then +- WINE_CHECK_SONAME(OSMesa,glAccum,,,[$X_LIBS -lm $X_EXTRA_LIBS]) ++ WINE_CHECK_SONAME(OSMesa,OSMesaCreateContext,,,[$X_LIBS -lm $X_EXTRA_LIBS]) ++ if test "x$ac_cv_lib_soname_OSMesa" = "x"; then ++ osmesa_save_CC=$CC ++ CC=$CXX ++ WINE_CHECK_SONAME(OSMesa,OSMesaCreateContext,,,[-lglapi -lpthread -ldl $X_LIBS -lm $X_EXTRA_LIBS]) ++ CC=$osmesa_save_CC ++ fi + WINE_NOTICE_WITH(osmesa,[test "x$ac_cv_lib_soname_OSMesa" = "x"], + [libOSMesa ${notice_platform}development files not found (or too old), OpenGL rendering in bitmaps won't be supported.]) + fi +-- +1.8.5.3 + diff --git a/app-emulation/wine/files/wine-1.7.28-gstreamer-v4.patch b/app-emulation/wine/files/wine-1.7.28-gstreamer-v4.patch new file mode 100644 index 0000000..fbf930b --- /dev/null +++ b/app-emulation/wine/files/wine-1.7.28-gstreamer-v4.patch @@ -0,0 +1,629 @@ +From 9e081cd4a04e3326d4927aa082695f15432590e2 Mon Sep 17 00:00:00 2001 +From: Maarten Lankhorst +Date: Thu, 14 Aug 2014 11:49:20 +0200 +Subject: [PATCH] TESTING -- override pthreads to fix gstreamer v4 + +I believe the code is ready and will work properly now in all cases. +but please test before cherry picking this patch, and report +success or failure to me please. + +Changes since v1: + - Call pthread_yield to make sure that we link against libpthread. + This fixes the build on saucy. +Changes since v2: + - Set thread_data->detached before creating the thread to prevent + a race condition. +Changes since v3: + - Set thread_data->detached CORRECTLY. Fix a small race between + thread creation and pthread_detach. +--- + dlls/ntdll/ntdll_misc.h | 3 + + dlls/ntdll/thread.c | 307 +++++++++++++++++++++++++++++++++++++-- + dlls/winegstreamer/glibthread.c | 13 ++ + libs/wine/loader.c | 7 + + libs/wine/wine.map | 6 + + loader/Makefile.in | 2 +- + loader/main.c | 41 +++++ + 7 files changed, 362 insertions(+), 17 deletions(-) + +diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h +index 4370084..1af819b 100644 +--- a/dlls/ntdll/ntdll_misc.h ++++ b/dlls/ntdll/ntdll_misc.h +@@ -28,6 +28,7 @@ + #include "winnt.h" + #include "winternl.h" + #include "wine/server.h" ++#include "wine/list.h" + + #define MAX_NT_PATH_LENGTH 277 + +@@ -235,6 +236,8 @@ struct ntdll_thread_data + WINE_VM86_TEB_INFO vm86; /* 1fc vm86 private data */ + void *exit_frame; /* 204 exit frame pointer */ + #endif ++ struct list entry; ++ BOOL detached; + }; + + static inline struct ntdll_thread_data *ntdll_get_thread_data(void) +diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c +index c8461b0..8d5470e 100644 +--- a/dlls/ntdll/thread.c ++++ b/dlls/ntdll/thread.c +@@ -33,6 +33,7 @@ + #ifdef HAVE_SYS_SYSCALL_H + #include + #endif ++#include + + #define NONAMELESSUNION + #include "ntstatus.h" +@@ -58,6 +59,7 @@ struct startup_info + TEB *teb; + PRTL_THREAD_START_ROUTINE entry_point; + void *entry_arg; ++ BOOL native_thread; + }; + + static PEB *peb; +@@ -202,6 +204,78 @@ static ULONG get_dyld_image_info_addr(void) + } + #endif /* __APPLE__ */ + ++#ifdef __linux__ ++extern typeof(pthread_create) *__glob_pthread_create, *call_pthread_create; ++extern typeof(pthread_join) *__glob_pthread_join, *call_pthread_join; ++extern typeof(pthread_detach) *__glob_pthread_detach, *call_pthread_detach; ++ ++static typeof(pthread_create) __hook_pthread_create; ++static typeof(pthread_join) __hook_pthread_join; ++static typeof(pthread_detach) __hook_pthread_detach; ++ ++static pthread_mutex_t thread_lock; ++ ++static void thread_wrap_init(void) ++{ ++ pthread_mutexattr_t attr; ++ pthread_mutexattr_init(&attr); ++ pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST); ++ pthread_mutex_init(&thread_lock, &attr); ++ pthread_mutexattr_destroy(&attr); ++ ++ call_pthread_create = __hook_pthread_create; ++ call_pthread_join = __hook_pthread_join; ++ call_pthread_detach = __hook_pthread_detach; ++} ++ ++static TEB *dead_teb; ++static struct list active_list = LIST_INIT(active_list); ++ ++static void take_thread_lock(void) ++{ ++ int ret = pthread_mutex_lock(&thread_lock); ++ if (ret == EOWNERDEAD) ++ pthread_mutex_consistent(&thread_lock); ++} ++ ++static void detach_thread_unlock(TEB *own_teb) ++{ ++ struct ntdll_thread_data *thread_data; ++ TEB *teb = dead_teb; ++ ++ dead_teb = own_teb; ++ ++ pthread_mutex_unlock(&thread_lock); ++ if (!teb) ++ return; ++ ++ thread_data = (struct ntdll_thread_data *)teb->SpareBytes1; ++ __glob_pthread_join(thread_data->pthread_id, NULL); ++ signal_free_thread(teb); ++} ++ ++static void reap_thread(TEB *teb) ++{ ++ struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1; ++ take_thread_lock(); ++ if (thread_data->detached) ++ detach_thread_unlock(teb); ++ else { ++ /* ++ * Do not unlock, wait until the thread is thoroughly dead. ++ * This prevents a race condition where detach is called ++ * after the thread has not finished dying yet. ++ */ ++ } ++} ++ ++#else ++#define __glob_pthread_create pthread_create ++#define __glob_pthread_join pthread_join ++#define __glob_pthread_detach pthread_detach ++#define thread_wrap_init() ++#endif ++ + /*********************************************************************** + * thread_init + * +@@ -220,6 +294,7 @@ HANDLE thread_init(void) + struct ntdll_thread_data *thread_data; + static struct debug_info debug_info; /* debug info for initial thread */ + ++ thread_wrap_init(); + virtual_init(); + + /* reserve space for shared user data */ +@@ -349,14 +424,12 @@ void terminate_thread( int status ) + pthread_exit( UIntToPtr(status) ); + } + +- +-/*********************************************************************** +- * exit_thread +- */ +-void exit_thread( int status ) ++static void exit_thread_common( int status ) + { ++#ifndef __linux__ + static void *prev_teb; + TEB *teb; ++#endif + + if (status) /* send the exit code to the server (0 is already the default) */ + { +@@ -380,24 +453,177 @@ void exit_thread( int status ) + + pthread_sigmask( SIG_BLOCK, &server_block_set, NULL ); + ++#ifndef __linux__ + if ((teb = interlocked_xchg_ptr( &prev_teb, NtCurrentTeb() ))) + { + struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1; + + if (thread_data->pthread_id) + { +- pthread_join( thread_data->pthread_id, NULL ); ++ __glob_pthread_join( thread_data->pthread_id, NULL ); + signal_free_thread( teb ); + } + } ++#else ++ reap_thread(NtCurrentTeb()); ++#endif + + close( ntdll_get_thread_data()->wait_fd[0] ); + close( ntdll_get_thread_data()->wait_fd[1] ); + close( ntdll_get_thread_data()->reply_fd ); + close( ntdll_get_thread_data()->request_fd ); ++} ++ ++void exit_thread( int status ) ++{ ++ exit_thread_common(status); + pthread_exit( UIntToPtr(status) ); + } + ++#ifdef __linux__ ++ ++struct unix_arg { ++ void *(*start)(void *); ++ void *arg; ++}; ++ ++/* dummy used for comparison */ ++static DWORD native_unix_start; ++ ++static void call_native_cleanup(void *arg) ++{ ++ exit_thread_common(0); ++} ++ ++static int ++__hook_pthread_create(pthread_t *thread, const pthread_attr_t *attr, ++ void *(*start_routine) (void *), void *parm) ++{ ++ NTSTATUS ret; ++ pthread_t tid; ++ size_t stack = 8 * 1024 * 1024; ++ struct unix_arg arg; ++ arg.start = start_routine; ++ arg.arg = parm; ++ ++ if (!thread) ++ thread = &tid; ++ ++ TRACE("Overriding thread creation!\n"); ++ if (attr) { ++ static int once; ++ if (!once++) ++ FIXME("most thread attributes ignored!\n"); ++ else ++ WARN("most thread attributes ignored!\n"); ++ ++ pthread_attr_getstacksize(attr, &stack); ++ } ++ ++ ret = RtlCreateUserThread( NtCurrentProcess(), NULL, FALSE, NULL, stack, 0, (void*)&native_unix_start, &arg, NULL, (void*)thread ); ++ if (ret != STATUS_SUCCESS) ++ FIXME("ret: %08x\n", ret); ++ switch (ret) { ++ case STATUS_SUCCESS: ++ TRACE("created thread %lx for %p/%p\n", *thread, start_routine, parm); ++ return 0; ++ case STATUS_NO_MEMORY: ++ return ENOMEM; ++ case STATUS_TOO_MANY_OPENED_FILES: ++ return EMFILE; ++ default: ++ ERR("Unhandled ntstatus %08x\n", ret); ++ return ENOMEM; ++ } ++} ++ ++static int __hook_pthread_detach(pthread_t thread) ++{ ++ struct ntdll_thread_data *thread_data; ++ TEB *teb = NULL; ++ ++ if (pthread_equal(thread, pthread_self())) { ++ TRACE("Detached self: %lx\n", pthread_self()); ++ ntdll_get_thread_data()->detached = 1; ++ return 0; ++ } ++ ++ take_thread_lock(); ++ LIST_FOR_EACH_ENTRY(thread_data, &active_list, typeof(*thread_data), entry) { ++ if (pthread_equal(thread_data->pthread_id, thread)) { ++ teb = CONTAINING_RECORD(thread_data, typeof(*teb), SpareBytes1); ++ ++ list_remove(&thread_data->entry); ++ if (!pthread_tryjoin_np(thread, NULL)) { ++ detach_thread_unlock(NULL); ++ TRACE("Thread %lx was dead, cleaning up\n", thread); ++ signal_free_thread(teb); ++ return 0; ++ } ++ thread_data->detached = 1; ++ break; ++ } ++ } ++ detach_thread_unlock(NULL); ++ if (!teb) ++ TRACE("Could not find thread %lx to detach\n", thread); ++ else ++ TRACE("Changed thread %lx to detached\n", thread); ++ return teb ? 0 : ESRCH; ++} ++ ++static int __hook_pthread_join(pthread_t thread, void **retval) ++{ ++ struct ntdll_thread_data *thread_data, *t2; ++ int ret = ESRCH; ++ ++ if (pthread_equal(thread, pthread_self())) ++ return EDEADLK; ++ ++ take_thread_lock(); ++ LIST_FOR_EACH_ENTRY(thread_data, &active_list, typeof(*thread_data), entry) { ++ TEB *teb = CONTAINING_RECORD(thread_data, typeof(*teb), SpareBytes1); ++ ++ if (pthread_equal(thread, thread_data->pthread_id)) { ++ ++ ret = pthread_tryjoin_np(thread, retval); ++ if (!ret) { ++ TRACE("Thread %lx was dead fastpath, cleaning up\n", thread); ++ goto free; ++ } ++ detach_thread_unlock(NULL); ++ ++ ret = __glob_pthread_join(thread, retval); ++ if (ret) { ++ TRACE("Thread %lx join failed with %i, ignoring\n", thread, ret); ++ return ret; ++ } ++ ++ take_thread_lock(); ++ /* Check if someone else freed the thread yet */ ++ LIST_FOR_EACH_ENTRY(t2, &active_list, typeof(*thread_data), entry) ++ if (t2 == thread_data) { ++ TRACE("Cleaning up after successful join\n"); ++ goto free; ++ } ++ TRACE("No clean up after successful join, multiple pthread_join's?\n"); ++ break; ++ ++free: ++ list_remove(&thread_data->entry); ++ detach_thread_unlock(NULL); ++ signal_free_thread(teb); ++ return 0; ++ } ++ } ++ ++ detach_thread_unlock(NULL); ++ if (ret) ++ TRACE("failed with %i\n", ret); ++ return ret; ++} ++ ++#endif + + /*********************************************************************** + * start_thread +@@ -426,9 +652,19 @@ static void start_thread( struct startup_info *info ) + if (TRACE_ON(relay)) + DPRINTF( "%04x:Starting thread proc %p (arg=%p)\n", GetCurrentThreadId(), func, arg ); + +- call_thread_entry_point( (LPTHREAD_START_ROUTINE)func, arg ); +-} ++#ifdef __linux__ ++ if (info->native_thread) { ++ void *(*start)(void*) = (void*)func; + ++ FIXME("Started native thread %08x\n", GetCurrentThreadId()); ++ pthread_cleanup_push(call_native_cleanup, NULL); ++ pthread_exit(start(arg)); ++ pthread_cleanup_pop(1); ++ return; ++ } ++#endif ++ call_thread_entry_point( (LPTHREAD_START_ROUTINE)func, arg ); ++} + + /*********************************************************************** + * RtlCreateUserThread (NTDLL.@) +@@ -440,14 +676,13 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR * + HANDLE *handle_ptr, CLIENT_ID *id ) + { + sigset_t sigset; +- pthread_t pthread_id; + pthread_attr_t attr; + struct ntdll_thread_data *thread_data; + struct startup_info *info = NULL; + HANDLE handle = 0, actctx = 0; + TEB *teb = NULL; + DWORD tid = 0; +- int request_pipe[2]; ++ int request_pipe[2], ret; + NTSTATUS status; + + if (process != NtCurrentProcess()) +@@ -472,10 +707,14 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR * + if (handle_ptr) *handle_ptr = wine_server_ptr_handle( result.create_thread.handle ); + else NtClose( wine_server_ptr_handle( result.create_thread.handle )); + } ++ TRACE("CreateThread for other process returns %08x\n", result.create_thread.status); + return result.create_thread.status; + } + +- if (server_pipe( request_pipe ) == -1) return STATUS_TOO_MANY_OPENED_FILES; ++ if (server_pipe( request_pipe ) == -1) { ++ TRACE("CreateThread cannot create request pipe: %m\n"); ++ return STATUS_TOO_MANY_OPENED_FILES; ++ } + wine_server_send_fd( request_pipe[0] ); + + SERVER_START_REQ( new_thread ) +@@ -496,12 +735,16 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR * + if (status) + { + close( request_pipe[1] ); ++ TRACE("CreateThread server request failed with %08x\n", status); + return status; + } + + pthread_sigmask( SIG_BLOCK, &server_block_set, &sigset ); + +- if ((status = signal_alloc_thread( &teb ))) goto error; ++ if ((status = signal_alloc_thread( &teb ))) { ++ TRACE("CreateThread signal thread allocation failed with %08x\n", status); ++ goto error; ++ } + + teb->Peb = NtCurrentTeb()->Peb; + teb->ClientId.UniqueProcess = ULongToHandle(GetCurrentProcessId()); +@@ -524,32 +767,64 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR * + + info = (struct startup_info *)(teb + 1); + info->teb = teb; +- info->entry_point = start; +- info->entry_arg = param; ++#ifdef __linux__ ++ info->native_thread = (void*)start == (void*)&native_unix_start; ++ if (info->native_thread) { ++ struct unix_arg *arg = param; ++ info->entry_point = (void*)arg->start; ++ info->entry_arg = arg->arg; ++ } else ++#endif ++ { ++ info->entry_point = start; ++ info->entry_arg = param; ++ } + + thread_data = (struct ntdll_thread_data *)teb->SpareBytes1; ++#ifdef __linux__ ++ thread_data->detached = !info->native_thread; ++#endif + thread_data->request_fd = request_pipe[1]; + thread_data->reply_fd = -1; + thread_data->wait_fd[0] = -1; + thread_data->wait_fd[1] = -1; ++ thread_data->entry.next = NULL; + +- if ((status = virtual_alloc_thread_stack( teb, stack_reserve, stack_commit ))) goto error; ++ if ((status = virtual_alloc_thread_stack( teb, stack_reserve ?: (8 << 20), stack_commit ?: (1 << 20) ))) { ++ TRACE("Allocating virtual stack for %p (%li/%li) failed with %08x\n", start, stack_reserve, stack_commit, status); ++ goto error; ++ } + + pthread_attr_init( &attr ); + pthread_attr_setstack( &attr, teb->DeallocationStack, + (char *)teb->Tib.StackBase - (char *)teb->DeallocationStack ); + pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM ); /* force creating a kernel thread */ + interlocked_xchg_add( &nb_threads, 1 ); +- if (pthread_create( &pthread_id, &attr, (void * (*)(void *))start_thread, info )) ++ ++ take_thread_lock(); ++ ret = __glob_pthread_create( &thread_data->pthread_id, &attr, (void * (*)(void *))start_thread, info ); ++ if (ret) + { ++ TRACE("pthread create failed with %i/%m\n", ret); + interlocked_xchg_add( &nb_threads, -1 ); + pthread_attr_destroy( &attr ); + status = STATUS_NO_MEMORY; + goto error; + } ++ if (!thread_data->detached) ++ list_add_tail(&active_list, &thread_data->entry); ++ detach_thread_unlock(NULL); ++ + pthread_attr_destroy( &attr ); + pthread_sigmask( SIG_SETMASK, &sigset, NULL ); + ++ TRACE("Created thread succesfully, win handle: %04x, pthread: %lx\n", tid, thread_data->pthread_id); ++ ++#ifdef __linux__ ++ if ((void*)start == (void*)&native_unix_start && id) ++ *(pthread_t*)id = thread_data->pthread_id; ++ else ++#endif + if (id) id->UniqueThread = ULongToHandle(tid); + if (handle_ptr) *handle_ptr = handle; + else NtClose( handle ); +diff --git a/dlls/winegstreamer/glibthread.c b/dlls/winegstreamer/glibthread.c +index 0d829a0..46e22f4 100644 +--- a/dlls/winegstreamer/glibthread.c ++++ b/dlls/winegstreamer/glibthread.c +@@ -43,6 +43,7 @@ + #include + #include + ++#if 0 + #include "windef.h" + #include "winbase.h" + #include "winnls.h" +@@ -388,3 +389,15 @@ void g_thread_impl_init (void) + g_thread_self_tls = TlsAlloc (); + g_thread_init(&g_thread_functions_for_glib_use_default); + } ++ ++#else ++ ++void g_thread_impl_init (void) ++{ ++ static gboolean beenhere = FALSE; ++ ++ if (!beenhere++) ++ g_thread_init(NULL); ++} ++ ++#endif +diff --git a/libs/wine/loader.c b/libs/wine/loader.c +index 7261522..a8c31b9 100644 +--- a/libs/wine/loader.c ++++ b/libs/wine/loader.c +@@ -73,6 +73,13 @@ char **__wine_main_argv = NULL; + WCHAR **__wine_main_wargv = NULL; + char **__wine_main_environ = NULL; + ++#ifdef __linux__ ++#include ++typeof(pthread_create) *call_pthread_create, *__glob_pthread_create; ++typeof(pthread_join) *call_pthread_join, *__glob_pthread_join; ++typeof(pthread_detach) *call_pthread_detach, *__glob_pthread_detach; ++#endif ++ + struct dll_path_context + { + unsigned int index; /* current index in the dll path list */ +diff --git a/libs/wine/wine.map b/libs/wine/wine.map +index 2159fac..fb3b951 100644 +--- a/libs/wine/wine.map ++++ b/libs/wine/wine.map +@@ -117,6 +117,12 @@ WINE_1.0 + wine_utf8_mbstowcs; + wine_utf8_wcstombs; + wine_wctype_table; ++ __glob_pthread_create; ++ call_pthread_create; ++ __glob_pthread_join; ++ call_pthread_join; ++ __glob_pthread_detach; ++ call_pthread_detach; + + local: *; + }; +diff --git a/loader/Makefile.in b/loader/Makefile.in +index 95e4798..a18dd02 100644 +--- a/loader/Makefile.in ++++ b/loader/Makefile.in +@@ -1,4 +1,4 @@ +-EXTRALIBS = $(PTHREAD_LIBS) ++EXTRALIBS = $(PTHREAD_LIBS) $(DL_LIBS) + + C_SRCS = \ + main.c \ +diff --git a/loader/main.c b/loader/main.c +index ac67290..76609e1 100644 +--- a/loader/main.c ++++ b/loader/main.c +@@ -202,6 +202,45 @@ static int pre_exec(void) + + #endif + ++#ifdef __linux__ ++ ++extern typeof(pthread_create) *call_pthread_create, *__glob_pthread_create; ++extern typeof(pthread_detach) *call_pthread_detach, *__glob_pthread_detach; ++extern typeof(pthread_join) *call_pthread_join, *__glob_pthread_join; ++ ++int pthread_create(pthread_t *thread, const pthread_attr_t *attr, ++ void *(*start_routine) (void *), void *arg) ++{ ++ return call_pthread_create(thread, attr, start_routine, arg); ++} ++ ++int pthread_detach(pthread_t thread) ++{ ++ return call_pthread_detach(thread); ++} ++ ++int pthread_join(pthread_t thread, void **retval) ++{ ++ return call_pthread_join(thread, retval); ++} ++ ++static void init_thread_hook(void) { ++ call_pthread_create = __glob_pthread_create = dlvsym(RTLD_NEXT, "pthread_create", "GLIBC_2.2.5"); ++ if (!__glob_pthread_create) ++ call_pthread_create = __glob_pthread_create = dlvsym(RTLD_NEXT, "pthread_create", "GLIBC_2.1"); ++ ++ call_pthread_detach = __glob_pthread_detach = dlsym(RTLD_NEXT, "pthread_detach"); ++ call_pthread_join = __glob_pthread_join = dlsym(RTLD_NEXT, "pthread_join"); ++ ++ /* Call a function from libpthread to ensure being linked against it */ ++ pthread_yield(); ++} ++ ++#else ++ ++#define init_thread_hook() ++ ++#endif + + /********************************************************************** + * main +@@ -211,6 +250,8 @@ int main( int argc, char *argv[] ) + char error[1024]; + int i; + ++ init_thread_hook(); ++ + if (!getenv( "WINELOADERNOEXEC" )) /* first time around */ + { + static char noexec[] = "WINELOADERNOEXEC=1"; +-- +1.7.6.6.GIT + diff --git a/app-emulation/wine/wine-1.7.11-r1.ebuild b/app-emulation/wine/wine-1.7.30.ebuild similarity index 54% rename from app-emulation/wine/wine-1.7.11-r1.ebuild rename to app-emulation/wine/wine-1.7.30.ebuild index bda5f3b..ed5f8d9 100644 --- a/app-emulation/wine/wine-1.7.11-r1.ebuild +++ b/app-emulation/wine/wine-1.7.30.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/app-emulation/wine/wine-1.7.11.ebuild,v 1.1 2014/01/22 06:58:56 tetromino Exp $ +# $Header: /var/cvsroot/gentoo-x86/app-emulation/wine/wine-1.7.29.ebuild,v 1.1 2014/10/25 20:37:44 ryao Exp $ EAPI="5" @@ -8,7 +8,7 @@ AUTOTOOLS_AUTORECONF=1 PLOCALES="ar bg ca cs da de el en en_US eo es fa fi fr he hi hr hu it ja ko lt ml nb_NO nl or pa pl pt_BR pt_PT rm ro ru sk sl sr_RS@cyrillic sr_RS@latin sv te th tr uk wa zh_CN zh_TW" PLOCALE_BACKUP="en" -inherit autotools-multilib eutils fdo-mime flag-o-matic gnome2-utils l10n multilib pax-utils toolchain-funcs virtualx +inherit autotools-utils eutils fdo-mime flag-o-matic gnome2-utils l10n multilib multilib-minimal pax-utils toolchain-funcs virtualx if [[ ${PV} == "9999" ]] ; then EGIT_REPO_URI="git://source.winehq.org/git/wine.git" @@ -24,7 +24,7 @@ fi GV="2.24" MV="4.5.2" -PULSE_PATCHES="winepulse-patches-1.7.10" +COMPHOLIO_P="wine-staging-${PV}" WINE_GENTOO="wine-gentoo-2013.06.24" DESCRIPTION="Free implementation of Windows(tm) on Unix" HOMEPAGE="http://www.winehq.org/" @@ -34,12 +34,13 @@ SRC_URI="${SRC_URI} abi_x86_64? ( mirror://sourceforge/${PN}/Wine%20Gecko/${GV}/wine_gecko-${GV}-x86_64.msi ) ) mono? ( mirror://sourceforge/${PN}/Wine%20Mono/${MV}/wine-mono-${MV}.msi ) - pulseaudio? ( http://dev.gentoo.org/~tetromino/distfiles/${PN}/${PULSE_PATCHES}.tar.bz2 ) + pipelight? ( https://github.com/wine-compholio/wine-staging/archive/v${PV}.tar.gz -> ${COMPHOLIO_P}.tar.gz ) + pulseaudio? ( https://github.com/wine-compholio/wine-staging/archive/v${PV}.tar.gz -> ${COMPHOLIO_P}.tar.gz ) http://dev.gentoo.org/~tetromino/distfiles/${PN}/${WINE_GENTOO}.tar.bz2" LICENSE="LGPL-2.1" SLOT="0" -IUSE="+abi_x86_32 +abi_x86_64 +alsa capi cups custom-cflags dos elibc_glibc +fontconfig +gecko gphoto2 gsm gstreamer +jpeg lcms ldap +mono mp3 ncurses netapi nls odbc openal opencl +opengl osmesa oss +perl +png +prelink pulseaudio +realtime +run-exes samba scanner selinux +ssl test +threads +truetype +udisks v4l +X xcomposite xinerama +xml" +IUSE="+abi_x86_32 +abi_x86_64 +alsa capi cups custom-cflags dos elibc_glibc +fontconfig +gecko gphoto2 gsm gstreamer +jpeg lcms ldap +mono mp3 ncurses netapi nls odbc openal opencl +opengl osmesa oss +perl pipelight +png +prelink pulseaudio +realtime +run-exes samba scanner selinux +ssl test +threads +truetype +udisks v4l +X xcomposite xinerama +xml" REQUIRED_USE="|| ( abi_x86_32 abi_x86_64 ) test? ( abi_x86_32 ) elibc_glibc? ( threads ) @@ -83,6 +84,7 @@ NATIVE_DEPEND=" nls? ( sys-devel/gettext ) odbc? ( dev-db/unixODBC:= ) osmesa? ( media-libs/mesa[osmesa] ) + pipelight? ( sys-apps/attr ) pulseaudio? ( media-sound/pulseaudio ) xml? ( dev-libs/libxml2 dev-libs/libxslt ) scanner? ( media-gfx/sane-backends:= ) @@ -97,100 +99,133 @@ COMMON_DEPEND=" abi_x86_64? ( ${NATIVE_DEPEND} ) abi_x86_32? ( truetype? ( || ( - >=app-emulation/emul-linux-x86-xlibs-2.1[development] - >=media-libs/freetype-2.0.0[abi_x86_32] + >=app-emulation/emul-linux-x86-xlibs-2.1[development,-abi_x86_32(-)] + >=media-libs/freetype-2.5.0.1[abi_x86_32(-)] ) ) ncurses? ( || ( - app-emulation/emul-linux-x86-baselibs[development] - sys-libs/ncurses[abi_x86_32] + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=sys-libs/ncurses-5.9-r3[abi_x86_32(-)] ) ) udisks? ( || ( - >=app-emulation/emul-linux-x86-baselibs-20130224[development] - sys-apps/dbus[abi_x86_32] + >=app-emulation/emul-linux-x86-baselibs-20130224[development,-abi_x86_32(-)] + >=sys-apps/dbus-1.6.18-r1[abi_x86_32(-)] ) ) fontconfig? ( || ( - app-emulation/emul-linux-x86-xlibs[development] - media-libs/fontconfig[abi_x86_32] + app-emulation/emul-linux-x86-xlibs[development,-abi_x86_32(-)] + >=media-libs/fontconfig-2.10.92[abi_x86_32(-)] + ) ) + gphoto2? ( || ( + app-emulation/emul-linux-x86-medialibs[development,-abi_x86_32(-)] + >=media-libs/libgphoto2-2.5.3.1[abi_x86_32(-)] ) ) - gphoto2? ( - app-emulation/emul-linux-x86-medialibs[development] - ) openal? ( || ( - app-emulation/emul-linux-x86-sdl[development] - media-libs/openal[abi_x86_32] + app-emulation/emul-linux-x86-sdl[development,-abi_x86_32(-)] + >=media-libs/openal-1.15.1[abi_x86_32(-)] ) ) - gstreamer? ( - app-emulation/emul-linux-x86-gstplugins - app-emulation/emul-linux-x86-medialibs[development] - ) - X? ( || ( - app-emulation/emul-linux-x86-xlibs[development] + gstreamer? ( || ( + app-emulation/emul-linux-x86-medialibs[development,-abi_x86_32(-)] ( - x11-libs/libXcursor[abi_x86_32] - x11-libs/libXext[abi_x86_32] - x11-libs/libXrandr[abi_x86_32] - x11-libs/libXi[abi_x86_32] - x11-libs/libXxf86vm[abi_x86_32] + >=media-libs/gstreamer-0.10.36-r2:0.10[abi_x86_32(-)] + >=media-libs/gst-plugins-base-0.10.36:0.10[abi_x86_32(-)] + ) + ) ) + X? ( || ( + app-emulation/emul-linux-x86-xlibs[development,-abi_x86_32(-)] + ( + >=x11-libs/libXcursor-1.1.14[abi_x86_32(-)] + >=x11-libs/libXext-1.3.2[abi_x86_32(-)] + >=x11-libs/libXrandr-1.4.2[abi_x86_32(-)] + >=x11-libs/libXi-1.7.2[abi_x86_32(-)] + >=x11-libs/libXxf86vm-1.1.3[abi_x86_32(-)] ) ) ) xinerama? ( || ( - app-emulation/emul-linux-x86-xlibs[development] - x11-libs/libXinerama[abi_x86_32] + app-emulation/emul-linux-x86-xlibs[development,-abi_x86_32(-)] + >=x11-libs/libXinerama-1.1.3[abi_x86_32(-)] ) ) alsa? ( || ( - app-emulation/emul-linux-x86-soundlibs[alsa,development] - media-libs/alsa-lib[abi_x86_32] + app-emulation/emul-linux-x86-soundlibs[alsa,development,-abi_x86_32(-)] + >=media-libs/alsa-lib-1.0.27.2[abi_x86_32(-)] ) ) - cups? ( app-emulation/emul-linux-x86-baselibs ) - opencl? ( virtual/opencl[abi_x86_32] ) + cups? ( || ( + app-emulation/emul-linux-x86-baselibs + >=net-print/cups-1.7.1-r1[abi_x86_32(-)] + ) ) + opencl? ( >=virtual/opencl-0-r3[abi_x86_32(-)] ) opengl? ( || ( - app-emulation/emul-linux-x86-opengl[development] + app-emulation/emul-linux-x86-opengl[development,-abi_x86_32(-)] ( - virtual/glu[abi_x86_32] - virtual/opengl[abi_x86_32] + >=virtual/glu-9.0-r1[abi_x86_32(-)] + >=virtual/opengl-7.0-r1[abi_x86_32(-)] ) ) ) gsm? ( || ( - app-emulation/emul-linux-x86-soundlibs[development] - media-sound/gsm[abi_x86_32] + app-emulation/emul-linux-x86-soundlibs[development,-abi_x86_32(-)] + >=media-sound/gsm-1.0.13-r1[abi_x86_32(-)] ) ) jpeg? ( || ( - app-emulation/emul-linux-x86-baselibs[development] - virtual/jpeg:0[abi_x86_32] + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=virtual/jpeg-0-r2:0[abi_x86_32(-)] + ) ) + ldap? ( || ( + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=net-nds/openldap-2.4.38-r1:=[abi_x86_32(-)] ) ) - ldap? ( app-emulation/emul-linux-x86-baselibs[development] ) lcms? ( || ( - app-emulation/emul-linux-x86-baselibs[development] - media-libs/lcms:2[abi_x86_32] + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=media-libs/lcms-2.5:2[abi_x86_32(-)] ) ) mp3? ( || ( - app-emulation/emul-linux-x86-soundlibs[development] - >=media-sound/mpg123-1.5.0[abi_x86_32] + app-emulation/emul-linux-x86-soundlibs[development,-abi_x86_32(-)] + >=media-sound/mpg123-1.15.4[abi_x86_32(-)] + ) ) + netapi? ( >=net-fs/samba-3.6.23-r1[netapi(+),abi_x86_32(-)] ) + nls? ( || ( + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=sys-devel/gettext-0.18.3.2[abi_x86_32(-)] + ) ) + odbc? ( || ( + app-emulation/emul-linux-x86-db[development,-abi_x86_32(-)] + >=dev-db/unixODBC-2.3.2:=[abi_x86_32(-)] ) ) - nls? ( app-emulation/emul-linux-x86-baselibs[development] ) - odbc? ( app-emulation/emul-linux-x86-db[development] ) osmesa? ( || ( - >=app-emulation/emul-linux-x86-opengl-20121028[development] - media-libs/mesa[osmesa,abi_x86_32] + >=app-emulation/emul-linux-x86-opengl-20121028[development,-abi_x86_32(-)] + >=media-libs/mesa-9.1.6[osmesa,abi_x86_32(-)] + ) ) + pipelight? ( || ( + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=sys-apps/attr-2.4.47-r1[abi_x86_32(-)] ) ) pulseaudio? ( || ( - app-emulation/emul-linux-x86-soundlibs[development] - >=media-sound/pulseaudio-4.0-r1[abi_x86_32] + app-emulation/emul-linux-x86-soundlibs[development,-abi_x86_32(-)] + >=media-sound/pulseaudio-5.0[abi_x86_32(-)] + ) ) + xml? ( || ( + >=app-emulation/emul-linux-x86-baselibs-20131008[development,-abi_x86_32(-)] + ( + >=dev-libs/libxml2-2.9.1-r4[abi_x86_32(-)] + >=dev-libs/libxslt-1.1.28-r1[abi_x86_32(-)] + ) + ) ) + scanner? ( || ( + app-emulation/emul-linux-x86-medialibs[development,-abi_x86_32(-)] + >=media-gfx/sane-backends-1.0.23:=[abi_x86_32(-)] + ) ) + ssl? ( || ( + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=net-libs/gnutls-2.12.23-r6:=[abi_x86_32(-)] ) ) - xml? ( >=app-emulation/emul-linux-x86-baselibs-20131008[development] ) - scanner? ( app-emulation/emul-linux-x86-medialibs[development] ) - ssl? ( app-emulation/emul-linux-x86-baselibs[development] ) png? ( || ( - app-emulation/emul-linux-x86-baselibs[development] - media-libs/libpng:0[abi_x86_32] + app-emulation/emul-linux-x86-baselibs[development,-abi_x86_32(-)] + >=media-libs/libpng-1.6.10:0[abi_x86_32(-)] ) ) v4l? ( || ( - app-emulation/emul-linux-x86-medialibs[development] - media-libs/libv4l[abi_x86_32] + app-emulation/emul-linux-x86-medialibs[development,-abi_x86_32(-)] + >=media-libs/libv4l-0.9.5[abi_x86_32(-)] ) ) xcomposite? ( || ( - app-emulation/emul-linux-x86-xlibs[development] - x11-libs/libXcomposite[abi_x86_32] + app-emulation/emul-linux-x86-xlibs[development,-abi_x86_32(-)] + >=x11-libs/libXcomposite-0.4.4-r1[abi_x86_32(-)] ) ) ) )" @@ -256,7 +291,8 @@ src_unpack() { unpack ${MY_P}.tar.bz2 fi - use pulseaudio && unpack "${PULSE_PATCHES}.tar.bz2" + use pipelight || use pulseaudio && unpack "${COMPHOLIO_P}.tar.gz" + unpack "${WINE_GENTOO}.tar.bz2" l10n_find_plocales_changes "${S}/po" "" ".po" @@ -264,17 +300,46 @@ src_unpack() { src_prepare() { local md5="$(md5sum server/protocol.def)" + local f local PATCHES=( "${FILESDIR}"/${PN}-1.5.26-winegcc.patch #260726 "${FILESDIR}"/${PN}-1.4_rc2-multilib-portage.patch #395615 - "${FILESDIR}"/${PN}-1.7.2-osmesa-check.patch #429386 + "${FILESDIR}"/${PN}-1.7.12-osmesa-check.patch #429386 "${FILESDIR}"/${PN}-1.6-memset-O3.patch #480508 - "${FILESDIR}"/${PN}-1.7.9-hcce.patch #46554 - ) - use pulseaudio && PATCHES+=( - "../${PULSE_PATCHES}"/*.patch #421365 ) + local COMPHOLIO_MAKE_ARGS="-W fonts-Missing_Fonts.ok" + use pulseaudio || COMPHOLIO_MAKE_ARGS="${COMPHOLIO_MAKE_ARGS} -W winepulse-PulseAudio_Support.ok" + if use gstreamer; then + # See http://bugs.winehq.org/show_bug.cgi?id=30557 + ewarn "Applying experimental patch to fix GStreamer support. Note that" + ewarn "this patch has been reported to cause crashes in certain games." + + PATCHES+=( "${FILESDIR}/${PN}-1.7.28-gstreamer-v4.patch" ) + fi + if use pipelight; then + ewarn "Applying the unofficial Compholio patchset for Pipelight support," + ewarn "which is unsupported by Wine developers. Please don't report bugs" + ewarn "to Wine bugzilla unless you can reproduce them with USE=-pipelight" + + # epatch doesn't support binary patches and we ship our own pulse patches + emake -C "${WORKDIR}/${COMPHOLIO_P}/patches" \ + $(echo ${COMPHOLIO_MAKE_ARGS}) \ + series + + PATCHES+=( $(sed -e "s:^:${WORKDIR}/${COMPHOLIO_P}/patches/:" \ + "${WORKDIR}/${COMPHOLIO_P}/patches/series") ) + + # epatch doesn't support binary patches + ebegin "Applying Compholio font patches" + for f in "${WORKDIR}/${COMPHOLIO_P}/patches/fonts-Missing_Fonts"/*.patch; do + "../${COMPHOLIO_P}/debian/tools/gitapply.sh" < "${f}" \ + || die "Failed to apply ${f}" + done + eend + elif use pulseaudio; then + PATCHES+=( "../${COMPHOLIO_P}/patches/winepulse-PulseAudio_Support"/*.patch ) + fi autotools-utils_src_prepare if [[ "$(md5sum server/protocol.def)" != "${md5}" ]]; then @@ -292,33 +357,15 @@ src_prepare() { l10n_get_locales > po/LINGUAS # otherwise wine doesn't respect LINGUAS } -do_configure() { - local myeconfargs=( "${myeconfargs[@]}" ) - - if use amd64; then - if [[ ${ABI} == amd64 ]]; then - myeconfargs+=( --enable-win64 ) - else - use netapi && ewarn "Disabling netapi in wine32; see https://bugs.gentoo.org/494394" - # We currently don't have 32-bit libnetapi on amd64; #494394 - myeconfargs+=( - --without-netapi - --disable-win64 - ) - fi - - # Note: using --with-wine64 results in problems with multilib.eclass - # CC/LD hackery. We're using separate tools instead. - fi - - autotools-utils_src_configure -} - src_configure() { export LDCONFIG=/bin/true use custom-cflags || strip-flags - local myeconfargs=( # common + multilib-minimal_src_configure +} + +multilib_src_configure() { + local myconf=( --sysconfdir=/etc/wine $(use_with alsa) $(use_with capi) @@ -342,6 +389,7 @@ src_configure() { $(use_with opengl) $(use_with osmesa) $(use_with oss) + --without-pcap $(use_with png) $(use_with threads pthread) $(use_with scanner sane) @@ -355,44 +403,55 @@ src_configure() { $(use_with xml xslt) ) - use pulseaudio && myeconfargs+=( --with-pulse ) + use pulseaudio && myconf+=( --with-pulse ) + use pipelight && myconf+=( --with-xattr ) - if use amd64 && use abi_x86_32; then - # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038 - # set AR and RANLIB to make QA scripts happy; #483342 - tc-export PKG_CONFIG AR RANLIB + local PKG_CONFIG AR RANLIB + # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038 + # set AR and RANLIB to make QA scripts happy; #483342 + tc-export PKG_CONFIG AR RANLIB + + if use amd64; then + if [[ ${ABI} == amd64 ]]; then + myconf+=( --enable-win64 ) + else + myconf+=( --disable-win64 ) + fi + + # Note: using --with-wine64 results in problems with multilib.eclass + # CC/LD hackery. We're using separate tools instead. fi - multilib_parallel_foreach_abi do_configure + ECONF_SOURCE=${S} \ + econf "${myconf[@]}" + emake depend } -src_compile() { - autotools-multilib_src_compile depend - autotools-multilib_src_compile all -} - -src_test() { - if [[ $(id -u) == 0 ]]; then - ewarn "Skipping tests since they cannot be run under the root user." - ewarn "To run the test ${PN} suite, add userpriv to FEATURES in make.conf" - return - fi - +multilib_src_test() { # FIXME: win32-only; wine64 tests fail with "could not find the Wine loader" - multilib_toolchain_setup x86 - local BUILD_DIR="${S}-${ABI}" - cd "${BUILD_DIR}" || die - WINEPREFIX="${T}/.wine-${ABI}" Xemake test + if [[ ${ABI} == x86 ]]; then + if [[ $(id -u) == 0 ]]; then + ewarn "Skipping tests since they cannot be run under the root user." + ewarn "To run the test ${PN} suite, add userpriv to FEATURES in make.conf" + return + fi + + WINEPREFIX="${T}/.wine-${ABI}" \ + Xemake test + fi } -src_install() { +multilib_src_install_all() { local DOCS=( ANNOUNCE AUTHORS README ) + local l add_locale_docs() { local locale_doc="documentation/README.$1" - [[ ! -e ${locale_doc} ]] || DOCS=( "${DOCS[@]}" ${locale_doc} ) + [[ ! -e ${locale_doc} ]] || DOCS+=( ${locale_doc} ) } l10n_for_each_locale_do add_locale_docs - autotools-multilib_src_install + + einstalldocs + prune_libtool_files --all emake -C "../${WINE_GENTOO}" install DESTDIR="${D}" EPREFIX="${EPREFIX}" if use gecko ; then