Factor the CMAKE_DATA_DIR, CMAKE_DOC_DIR, and CMAKE_MAN_DIR selection
out of CMakeLists.txt and into a Source/CMakeInstallDestinations.cmake
script. Load the script from the original location of the code.
Cache the destination values as empty strings so we know if the user
sets them explicitly. If not, then compute defaults based on the
platform and full CMake version string. By not caching the versioned
defaults, we can change them in a single build tree as the version
changes.
Remove duplication of the install destination defaults from the
bootstrap script. Cache empty defaults there too. Parse from the CMake
code the default values to report in the help output. Keep the CMake
code in a structured format to make this reliable.
Move the cmake::ExecuteCMakeCommand static method and all the static
methods it calls out of the 'cmake' class to a separate 'cmcmd' class.
Build the latter as part of the main cmake executable with cmakemain.cxx
and not in CMakeLib. Drop unused header includes from "cmake.cxx".
By moving this implementation out of cmake.cxx we avoid carrying it
around in all the executables that use class 'cmake'. It is needed only
for the main "cmake -E" functionality.
The workaround currently present works fine without -O or with -O1, but fails
with -Os or -O2 and higher. Using -O2 is common e.g. in Gentoo, as resulting in
bugs like this:
https://bugs.gentoo.org/473276
Prevent the workaround for higher optimization levels to make bootstrapping
more likely to succeed.
This is still a workaround as ld still keeps crashing in some situations.
Ensure CMAKE_DATA_DIR, CMAKE_DOC_DIR, and CMAKE_MAN_DIR are always
relative paths in CMake code, and set defaults accordingly. Use the
install() command instead of install_files() and install_targets().
This is more modern and also avoids stripping of the first character
from user-specified destinations.
While at it, fix the default destinations reported in the bootstrap
help.
Revert commit a1c032b9 (bootstrap: Suppress CMAKE_OSX_SYSROOT if CFLAGS
have -isysroot, 2012-09-21). If MACOSX_DEPLOYMENT_TARGET is set then
CMAKE_OSX_DEPLOYMENT_TARGET will be set and Darwin.cmake will complain
if no CMAKE_OSX_SYSROOT is set. Just allow both -isysroot flags to
appear. The one generated by CMAKE_OSX_SYSROOT appears after and
overrides the one from CFLAGS/CXXFLAGS.
The parent commit merged a change to KWSys that adds preprocessor
definitions for KWSYS_CXX_HAS_UTIMENSAT and KWSYS_CXX_HAS_UTIMES to the
command line for compiling SystemTools. For bootstrapping we do not
need sub-1s timestamps so just define them to 0 for now.
The KWSys "EncodeExecutable" and "ProcessFwd9x" executables were dropped
from KWSys along with Win9x Process support. Drop references from the
rest of the CMake build rules.
There is a binutils bug that leads to errors like this:
/usr/lib/gcc/hppa2.0-unknown-linux-gnu/4.6.3/../../../../hppa2.0-unknown-linux-gnu/bin/ld: libCMakeLib.a(cmTarget.cxx.o)(.text+0x12084): cannot reach 00001d28__ZNSspLEPKc@@GLIBCXX_3.4+0, recompile with -ffunction-sections
/usr/lib/gcc/hppa2.0-unknown-linux-gnu/4.6.3/../../../../hppa2.0-unknown-linux-gnu/bin/ld: libCMakeLib.a(cmTarget.cxx.o)(.text+0x12084): cannot handle R_PARISC_PCREL17F for std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator+=(char const*)@@GLIBCXX_3.4
/usr/lib/gcc/hppa2.0-unknown-linux-gnu/4.6.3/../../../../hppa2.0-unknown-linux-gnu/bin/ld: final link failed: Bad value
Until someone finds out what needs to be fixed in binutils this allows anyone
to compile a working CMake even in debug mode.
80112da Merge topic 'AutomocUseTargetProperties' into export-sets
955b966 exports: add a test for exporting dependent targets
6f50a04 exports: define a CMAKE_FIND_PACKAGE_NAME var set by find_package()
0cfd055 exports: move the handling of missing targets into subclasses
190f2c8 exports: fix build with MSVC6
8b5f448 exports: first try at error handling if a target is missing
87f4c01 exports: accept a missing target if it is exported exactly once
999061a exports: store pointers to all installations of each export set
64b3a6c exports: cmGlobalGenerator::ExportSets destructor will clear it
81cdab5 exports: Hold an ExportSet pointer in cm*Export*Generator
5c898fb exports: Add cmExportSetMap class
d13ec1a exports: Create class cmExportSet
4e2347c exports: Rename cmGlobalGenerator::AddTargetToExport{s,}
e846e70 exports: Remove cmTargetExport constructor
81c66c8 exports: Move cmTargetExport to a dedicated header file
ae4ab62 find_package: add support for a <package>_NOT_FOUND_MESSAGE variable
...
083de7e Process generator expressions in the COMPILE_DEFINITIONS target property.
08cb4fa Process generator expressions in the INCLUDE_DIRECTORIES property.
0ef091d Early return if there is no target.
eb250cd Add a self-reference check for target properties.
7e80747 Add API to check that dependent target properties form a DAG.
239ac84 Add a generator expression for target properties.
e028381 Extend the generator expression language with more logic.
b8e61d6 Refactor GetCompileDefinitions a bit.
2c2b25b Return a std::string from GetCompileDefinitions.
b7e48e0 Add an AppendDefines std::string overload.
9a16087 Convert paths in INCLUDE_DIRECTORIES property to Unix slashes.
4557c8d Don't prepend a path before generator expressions in include_directories.
c6abc41 Add include guard for cmGeneratorExpression.
0ff4e3f Port remaining code to GetCompileDefinitions().
f178d53 Fix indentation in the code blocks generator.
In order to bootstrap on OS X with Xcode without the command line tools
one must add -isysroot to CFLAGS and CXXFLAGS. In this case the flags
will make it into the configured CMake. Set CMAKE_OSX_SYSROOT to empty
in the initial cache to prevent CMake from adding -isysroot again.
The expressions may be parsed and then cached and evaluated multiple
times. They are evaluated lazily so that literals such as ',' can be
treated as universal parameter separators, and can be processed from
results without appearing literally, and without interfering with the
parsing/evaluation of the entire expression.
At the top of a build tree we configure inside the CMakeFiles directory
files such as "CMakeSystem.cmake" and "CMake<lang>Compiler.cmake" to
save information detected about the system and compilers in use. The
method of detection and the exact results store varies across CMake
versions as things improve. This leads to problems when loading files
configured by a different version of CMake. Previously we ignored such
existing files only if the major.minor part of the CMake version
component changed, and depended on the CMakeCache.txt to tell us the
last version of CMake that wrote the files. This led to problems if the
user deletes the CMakeCache.txt or we add required information to the
files in a patch-level release of CMake (still a "feature point" release
by modern CMake versioning convention).
Ensure that we always have version-consistent platform information files
by storing them in a subdirectory named with the CMake version. Every
version of CMake will do its own system and compiler identification
checks even when a build tree has already been configured by another
version of CMake. Stored results will not clobber those from other
versions of CMake which may be run again on the same tree in the future.
Loaded results will match what the system and language modules expect.
Rename the undocumented variable CMAKE_PLATFORM_ROOT_BIN to
CMAKE_PLATFORM_INFO_DIR to clarify its purpose. The new variable points
at the version-specific directory while the old variable did not.
Since commit f39e82c9 (bootstrap: Re-implement command line option
processing, 2011-12-16) bootstrap uses POSIX shell expressions of the
form "${x#y}" to remove prefix pattern 'y' from the vaule of 'x'.
Although this is allowed by POSIX old shells on some platforms do not
support it. Revert to using 'sed' to work with old shells.
The SystemTools::PutEnv function tries to provide the "putenv" API
without leaking memory. However, the kwsysDeletingCharVector singleton
frees memory that may still be referenced by the environment table,
having been placed there by putenv. If any static destruction or
processing by an external tool happens after the singleton is destroyed
and accesses the environment it will read invalid memory.
Replace use of putenv with setenv/unsetenv when available. The latter
manage internal copies of the values passed instead of referencing the
original memory. When setenv/unsetenv are not available use putenv with
a singleton that removes its values from the environment before freeing
their memory. This requires an "unputenv" implementation. On at least
some platforms it must be written in terms of "putenv" because other
APIs are not available and direct modification of the "environ" global
is not safe (e.g. on Windows there is interaction with "wenviron").
Fortunately either putenv("A=") or putenv("A") will remove "A" from the
environment on these platforms. On other platforms fall back to direct
manipulation of "environ".
Also add UnPutEnv to the API and add a test for the behavior of both.
Move the CMake version number components out of "CMakeLists.txt" into
dedicated file "Source/CMakeVersion.cmake". Set the TWEAK level to the
date explicitly. Add a "Source/CMakeVersion.bash" script to update the
date, thus replacing KWSys DateStamp for CMake. Teach the bootstrap
script to extract the version components from their new location.
Some per-target information and logic is common to all generators.
Some of that information is currently stored in cmTarget but that
should be reserved for the configure step. Create a class to hold
per-target information for generators. On construction classify
sources from the target and store them in separate members. This
classification is already implemented separately in each generator.
We set CMAKE_PREFIX_PATH from the --prefix= option. The calling shell
might not translate "/c/..." to "c:/..." paths but we need to store
Windows paths in CMake cache variables. Pass the specified path through
the MSYS shell in a form it will convert to a Windows path using the
MSYS fstab.
Some MSYS bash implementations leave trailing space on the command line
to 'cmd /c echo ...' after quoting the message. The Windows echo tool
preserves both the quotes and the trailing space. Use a sed expression
that strips quotes and trailing spaces after the end quote.
Provide an interface simpler than --init= to set cache values during
bootstrap builds. For example:
./bootstrap --system-zlib -- -DZLIB_ROOT=/opt/zlib
will configure CMake with a system zlib library and initialize ZLIB_ROOT
in the cache for use by FindZLIB.
This adds the ability for packagers to specify that some libraries
should use system versions and others should use the CMake versions.
This allows a bit of flexibility and means Homebrew (an OSX package
manager) no longer has to continue to patch the CMake build process.
Inspired-by: Mike McQuaid <mike@mikemcquaid.com>
The Makefile, VS, and Xcode generators previously duplicated some custom
command line generation code. Factor this out into a separate class
cmCustomCommandGenerator shared by all generators.
Look for a C/C++ compiler pair from known toolchains on some platforms.
This makes it less likely that mismatched compilers will be found.
Check only if the environment variables CC and CXX are both empty.
GCC places the vtable in the object implementing the first non-pure,
non-inline virtual method. Since the symbol is not weak on Tru64, make
the location unique by putting the destructor in a single object file.
Prepare to switch to the workflow described by "git help workflows". In
this workflow, the "master" branch is always used to integrate topics
ready for release. Brand new work merges into a "next" branch instead.
We need a new versioning scheme to work this way because the version on
"master" must always increase.
We no longer use an even/odd minor number to distinguish releases from
development versions. Since we still support cvs checkout of our source
tree we cannot depend on "git describe" to compute a version number
based on the history graph. We can use the CCYYMMDD nightly date stamp
to get a monotonically increasing version component.
The new version format is "major.minor.patch.(tweak|date)". Releases
use a tweak level in the half-open range [0,20000000), which is smaller
than any current or future date. For tweak=0 we do not show the tweak
component, leaving the format "major.minor.patch" for most releases.
Development versions use date=CCYYMMDD for the tweak level. The
major.minor.patch part of development versions on "master" always
matches the most recent release.
For example, a first-parent traversal of "master" might see
v2.8.1 2.8.1.20100422 v2.8.2
| | |
----o----o----o----o----o----o----o----o----
Since the date appears in the tweak component, the next release can
increment the patch level (or any more significant component) to be
greater than any version leading to it. Topic branches not ready for
release are published only on "next" so we know that all versions on
master lead between two releases.
Since Haiku does not have /usr (and therefore /usr/local), this commit
changes the default install prefix to the equivalent directory of
/boot/common.
See issue #9607.