Cygwin: Do not define 'WIN32' (#10122)
One of Cygwin's goals is to build projects using the POSIX API with no Windows awareness. Many CMake-built projects have been written to test for UNIX and WIN32 but not CYGWIN. The preferred behavior under Cygwin in such projects is to take the UNIX path but not the WIN32 path. Unfortunately this change is BACKWARDS INCOMPATIBLE for Cygwin-aware CMake projects! Some projects that previously built under Cygwin and are Cygwin-aware when they test for WIN32 may now behave differently. Eventually these projects will need to be updated, but to help users build them in the meantime we print a warning about the change in behavior. Furthermore, one may set CMAKE_LEGACY_CYGWIN_WIN32 to request old behavior during the transition. Normally we avoid backwards incompatible changes, but we make an exception in this case for a few reasons: (1) This behavior is preferred by Cygwin's design goals. (2) A warning provides a clear path forward for everyone who may see incompatible behavior, and CMAKE_LEGACY_CYGWIN_WIN32 provides a compatibility option. The warning and compatibility option both disappear when the minimum required version of CMake in a project is sufficiently new, so this issue will simply go away over time as projects are updated to account for the change. (3) The fixes required to update projects are fairly insignificant. Furthermore, the Cygwin distribution has no releases itself so project versions that predate said fixes tend to be difficult to build anyway. (4) This change enables many CMake-built projects that did not previously build under Cygwin to work out-of-the-box. From bug #10122: "I have built over 120 different source packages with (my patched) CMake, including most of KDE4, and have found that NOT defining WIN32 on Cygwin is much more accurate." -- Yaakov Selkowitz A fully compatible change would require patches on top of these project releases for Cygwin even though they otherwise need not be aware of it. (5) Yaakov has been maintaining a fork of CMake with this change for the Cygwin Ports distribution. It works well in practice. By accepting the change in upstream CMake we avoid confusion between the versions. CMake itself builds without WIN32 defined on Cygwin. Simply disable CMAKE_LEGACY_CYGWIN_WIN32 explicitly in our own CMakeLists.txt file.
This commit is contained in:
parent
62c6d2d7e7
commit
85c0a69a92
|
@ -10,6 +10,7 @@
|
||||||
# See the License for more information.
|
# See the License for more information.
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5 FATAL_ERROR)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5 FATAL_ERROR)
|
||||||
|
SET(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
|
||||||
PROJECT(CMake)
|
PROJECT(CMake)
|
||||||
IF(COMMAND CMAKE_POLICY)
|
IF(COMMAND CMAKE_POLICY)
|
||||||
CMAKE_POLICY(SET CMP0003 NEW)
|
CMAKE_POLICY(SET CMP0003 NEW)
|
||||||
|
|
|
@ -1,4 +1,48 @@
|
||||||
SET(WIN32 1)
|
if("${CMAKE_MINIMUM_REQUIRED_VERSION}" VERSION_LESS "2.8.3.20101214")
|
||||||
|
set(__USE_CMAKE_LEGACY_CYGWIN_WIN32 1)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED WIN32)
|
||||||
|
set(WIN32 0)
|
||||||
|
if(DEFINED __USE_CMAKE_LEGACY_CYGWIN_WIN32)
|
||||||
|
if(NOT DEFINED CMAKE_LEGACY_CYGWIN_WIN32
|
||||||
|
AND DEFINED ENV{CMAKE_LEGACY_CYGWIN_WIN32})
|
||||||
|
set(CMAKE_LEGACY_CYGWIN_WIN32 $ENV{CMAKE_LEGACY_CYGWIN_WIN32})
|
||||||
|
endif()
|
||||||
|
if(CMAKE_LEGACY_CYGWIN_WIN32)
|
||||||
|
message(STATUS "Defining WIN32 under Cygwin due to CMAKE_LEGACY_CYGWIN_WIN32")
|
||||||
|
set(WIN32 1)
|
||||||
|
elseif("x${CMAKE_LEGACY_CYGWIN_WIN32}" STREQUAL "x")
|
||||||
|
message(WARNING "CMake no longer defines WIN32 on Cygwin!"
|
||||||
|
"\n"
|
||||||
|
"(1) If you are just trying to build this project, ignore this warning "
|
||||||
|
"or quiet it by setting CMAKE_LEGACY_CYGWIN_WIN32=0 in your environment or "
|
||||||
|
"in the CMake cache. "
|
||||||
|
"If later configuration or build errors occur then this project may "
|
||||||
|
"have been written under the assumption that Cygwin is WIN32. "
|
||||||
|
"In that case, set CMAKE_LEGACY_CYGWIN_WIN32=1 instead."
|
||||||
|
"\n"
|
||||||
|
"(2) If you are developing this project, add the line\n"
|
||||||
|
" set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required\n"
|
||||||
|
"at the top of your top-level CMakeLists.txt file or set the minimum "
|
||||||
|
"required version of CMake to 2.8.4 or higher. "
|
||||||
|
"Then teach your project to build on Cygwin without WIN32.")
|
||||||
|
endif()
|
||||||
|
elseif(DEFINED CMAKE_LEGACY_CYGWIN_WIN32)
|
||||||
|
message(AUTHOR_WARNING "CMAKE_LEGACY_CYGWIN_WIN32 ignored because\n"
|
||||||
|
" cmake_minimum_required(VERSION ${CMAKE_MINIMUM_REQUIRED_VERSION})\n"
|
||||||
|
"is at least 2.8.4.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(DEFINED __USE_CMAKE_LEGACY_CYGWIN_WIN32)
|
||||||
|
# Pass WIN32 legacy setting to scripts.
|
||||||
|
if(WIN32)
|
||||||
|
set(ENV{CMAKE_LEGACY_CYGWIN_WIN32} 1)
|
||||||
|
else()
|
||||||
|
set(ENV{CMAKE_LEGACY_CYGWIN_WIN32} 0)
|
||||||
|
endif()
|
||||||
|
unset(__USE_CMAKE_LEGACY_CYGWIN_WIN32)
|
||||||
|
endif()
|
||||||
|
|
||||||
SET(CYGWIN 1)
|
SET(CYGWIN 1)
|
||||||
|
|
||||||
SET(CMAKE_SHARED_LIBRARY_PREFIX "cyg")
|
SET(CMAKE_SHARED_LIBRARY_PREFIX "cyg")
|
||||||
|
|
|
@ -2340,17 +2340,19 @@ void cmMakefile::AddDefaultDefinitions()
|
||||||
working, these variables are still also set here in this place, but they
|
working, these variables are still also set here in this place, but they
|
||||||
will be reset in CMakeSystemSpecificInformation.cmake before the platform
|
will be reset in CMakeSystemSpecificInformation.cmake before the platform
|
||||||
files are executed. */
|
files are executed. */
|
||||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32)
|
||||||
this->AddDefinition("WIN32", "1");
|
this->AddDefinition("WIN32", "1");
|
||||||
this->AddDefinition("CMAKE_HOST_WIN32", "1");
|
this->AddDefinition("CMAKE_HOST_WIN32", "1");
|
||||||
#else
|
#else
|
||||||
this->AddDefinition("UNIX", "1");
|
this->AddDefinition("UNIX", "1");
|
||||||
this->AddDefinition("CMAKE_HOST_UNIX", "1");
|
this->AddDefinition("CMAKE_HOST_UNIX", "1");
|
||||||
#endif
|
#endif
|
||||||
// Cygwin is more like unix so enable the unix commands
|
|
||||||
#if defined(__CYGWIN__)
|
#if defined(__CYGWIN__)
|
||||||
this->AddDefinition("UNIX", "1");
|
if(cmSystemTools::IsOn(cmSystemTools::GetEnv("CMAKE_LEGACY_CYGWIN_WIN32")))
|
||||||
this->AddDefinition("CMAKE_HOST_UNIX", "1");
|
{
|
||||||
|
this->AddDefinition("WIN32", "1");
|
||||||
|
this->AddDefinition("CMAKE_HOST_WIN32", "1");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
this->AddDefinition("APPLE", "1");
|
this->AddDefinition("APPLE", "1");
|
||||||
|
|
Loading…
Reference in New Issue