Commit b74a346 for zlib
commit b74a346cbf6b9fac87ec2746a8c678bd0a65b7c8
Author: Vollstrecker <werner@vollstreckernet.de>
Date: Tue Dec 30 14:29:38 2025 +0100
CMake: Added contrib/ada.
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index 94e2875..cc4b331 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -1,5 +1,13 @@
+option(ZLIB_BUILD_ADA "Enable building of Ada bindings" OFF)
option(ZLIB_BUILD_MINIZIP "Enable building libminizip contrib library" OFF)
+if(ZLIB_BUILD_ADA)
+ set(ZLIBADA_BUILD_SHARED ${ZLIB_BUILD_SHARED})
+ set(ZLIBADA_BUILD_STATIC ${ZLIB_BUILD_STATIC})
+ set(ZLIBADA_BUILD_TESTING ${ZLIB_BUILD_TESTING})
+ add_subdirectory(ada/)
+endif(ZLIB_BUILD_ADA)
+
if(ZLIB_BUILD_MINIZIP)
set(MINIZIP_BUILD_SHARED ${ZLIB_BUILD_SHARED})
set(MINIZIP_BUILD_STATIC ${ZLIB_BUILD_STATIC})
diff --git a/contrib/ada/CMakeLists.txt b/contrib/ada/CMakeLists.txt
new file mode 100644
index 0000000..98f7b97
--- /dev/null
+++ b/contrib/ada/CMakeLists.txt
@@ -0,0 +1,214 @@
+cmake_minimum_required(VERSION 3.12...3.31)
+
+set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
+
+project(
+ zlibAda
+ VERSION 1.0.0
+ LANGUAGES ADA
+ DESCRIPTION "A library for creating zipfiles based in zlib"
+ HOMEPAGE_URL "https://www.zlib.net")
+
+option(ZLIBADA_BUILD_SHARED "Enable building ada bindings shared library" ON)
+option(ZLIBADA_BUILD_STATIC "Enable building ada bindings static library" ON)
+option(ZLIBADA_BUILD_TESTING "Enable building tests for ada bindings library" ON)
+
+if(WIN32 OR CYGWIN)
+ set(zlibAda_static_suffix "s")
+ set(CMAKE_DEBUG_POSTFIX "d")
+endif(WIN32 OR CYGWIN)
+
+if(NOT DEFINED ZLIB_BUILD_ADA)
+ if(ZLIBADA_BUILD_SHARED)
+ list(APPEND REQUIRED_COMPONENTS "shared")
+ endif(ZLIBADA_BUILD_SHARED)
+
+ if(ZLIBADA_BUILD_STATIC)
+ list(APPEND REQUIRED_COMPONENTS "static")
+ endif(ZLIB_BUILD_STATIC)
+
+ find_package(ZLIB REQUIRED COMPONENTS ${REQUIRED_COMPONENTS} CONFIG)
+endif(NOT DEFINED ZLIB_BUILD_ADA)
+
+function(ZLIBADA_findTestEnv testName)
+ set(testEnv "PATH=")
+
+ if(MSVC OR MINGW)
+ set(separator "\\\;")
+ else()
+ set(separator ":")
+ endif()
+
+ string(APPEND testEnv "$<TARGET_FILE_DIR:ZLIB::ZLIB>${separator}")
+ string(APPEND testEnv "$ENV{PATH}")
+
+ set_tests_properties(${testName} PROPERTIES ENVIRONMENT "${testEnv}")
+endfunction(ZLIBADA_findTestEnv testName)
+
+if(ZLIBADA_BUILD_SHARED)
+ ada_add_library(zlib-Ada SHARED
+ zlib-thin.adb
+ zlib.adb)
+
+ target_link_libraries(zlib-Ada
+ INTERFACE ZLIB::ZLIB)
+
+ ada_add_library(zlib-streams SHARED
+ zlib-streams.adb)
+
+ target_link_libraries(zlib-streams
+ PUBLIC
+ zlib-Ada)
+
+ ada_find_ali(zlib-streams)
+
+ if(ZLIBADA_BUILD_TESTING)
+ enable_testing()
+ ada_add_executable(ada-test test.adb)
+
+ target_link_libraries(ada-test
+ PRIVATE
+ zlib-Ada
+ zlib-streams)
+
+ ada_find_ali(ada-test)
+
+ add_test(NAME zlibAda_ada-test COMMAND ada-test)
+ set_tests_properties(zlibAda_ada-test PROPERTIES FIXTURES_REQUIRED ada_cleanup)
+
+ if(MSVC
+ OR MSYS
+ OR MINGW
+ OR CYGWIN)
+ zlibada_findtestenv(zlibAda_ada-test)
+ endif(
+ MSVC
+ OR MSYS
+ OR MINGW
+ OR CYGWIN)
+
+ ada_add_executable(buffer_demo buffer_demo.adb)
+
+ target_link_libraries(buffer_demo
+ PRIVATE
+ zlib-Ada)
+
+ ada_find_ali(buffer_demo)
+
+ add_test(NAME zlibAda_buffer-demo COMMAND buffer_demo)
+
+ if(MSVC
+ OR MSYS
+ OR MINGW
+ OR CYGWIN)
+ zlibada_findtestenv(zlibAda_buffer-demo)
+ endif(
+ MSVC
+ OR MSYS
+ OR MINGW
+ OR CYGWIN)
+
+ ada_add_executable(mtest mtest.adb)
+
+ target_link_libraries(mtest
+ PRIVATE
+ zlib-Ada)
+
+ ada_find_ali(mtest)
+
+ #Not adding test as this is an endless-loop
+
+ ada_add_executable(read read.adb)
+
+ target_link_libraries(read
+ PRIVATE
+ zlib-Ada)
+
+ ada_find_ali(read)
+
+ add_test(NAME zlibAda_read COMMAND read)
+
+ if(MSVC
+ OR MSYS
+ OR MINGW
+ OR CYGWIN)
+ zlibada_findtestenv(zlibAda_read)
+ endif(
+ MSVC
+ OR MSYS
+ OR MINGW
+ OR CYGWIN)
+ endif(ZLIBADA_BUILD_TESTING)
+endif(ZLIBADA_BUILD_SHARED)
+
+if(ZLIBADA_BUILD_STATIC)
+ ada_add_library(zlib-AdaStatic STATIC
+ zlib-thin.adb
+ zlib.adb)
+
+ target_link_libraries(zlib-AdaStatic
+ INTERFACE ZLIB::ZLIBSTATIC)
+
+ set_target_properties(zlib-AdaStatic
+ PROPERTIES OUTPUT_NAME zlib-Ada${zlibAda_static_suffix})
+
+ ada_add_library(zlib-streamsStatic STATIC
+ zlib-streams.adb)
+
+ target_link_libraries(zlib-streamsStatic
+ PUBLIC
+ zlib-AdaStatic)
+
+ ada_find_ali(zlib-streamsStatic)
+
+ if(ZLIBADA_BUILD_TESTING)
+ enable_testing()
+ ada_add_executable(ada-testStatic test.adb)
+
+ target_link_libraries(ada-testStatic
+ PRIVATE
+ zlib-AdaStatic
+ zlib-streamsStatic)
+
+ ada_find_ali(ada-testStatic)
+
+ add_test(NAME zlibAda_ada-testStatic COMMAND ada-testStatic)
+ set_tests_properties(zlibAda_ada-testStatic PROPERTIES FIXTURES_REQUIRED ada_cleanup)
+
+ ada_add_executable(buffer_demoStatic buffer_demo.adb)
+
+ target_link_libraries(buffer_demoStatic
+ PRIVATE
+ zlib-AdaStatic)
+
+ ada_find_ali(buffer_demoStatic)
+
+ add_test(NAME zlibAda-buffer-demoStatic COMMAND buffer_demoStatic)
+
+ ada_add_executable(mtestStatic mtest.adb)
+
+ target_link_libraries(mtestStatic
+ PRIVATE
+ zlib-AdaStatic)
+
+ ada_find_ali(mtestStatic)
+
+ # Not adding test as this is an endless-loop
+
+ ada_add_executable(readStatic read.adb)
+
+ target_link_libraries(readStatic
+ PRIVATE
+ zlib-AdaStatic)
+
+ ada_find_ali(readStatic)
+
+ add_test(NAME zlibAda_readStatic COMMAND readStatic)
+ endif(ZLIBADA_BUILD_TESTING)
+endif(ZLIBADA_BUILD_STATIC)
+
+if(ZLIBADA_BUILD_TESTING)
+ add_test(NAME zlibAda_cleanup COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_BINARY_DIR}/testzlib.in
+ ${CMAKE_CURRENT_BINARY_DIR}/testzlib.out ${CMAKE_CURRENT_BINARY_DIR}/testzlib.zlb)
+ set_tests_properties(zlibAda_cleanup PROPERTIES FIXTURES_CLEANUP ada_cleanup)
+endif(ZLIBADA_BUILD_TESTING)
diff --git a/contrib/ada/cmake/Modules/CMakeADACompiler.cmake.in b/contrib/ada/cmake/Modules/CMakeADACompiler.cmake.in
new file mode 100644
index 0000000..a3a4086
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeADACompiler.cmake.in
@@ -0,0 +1,23 @@
+set(CMAKE_ADA_COMPILER "@CMAKE_ADA_COMPILER@")
+set(CMAKE_ADA_COMPILER_ARG1 "@CMAKE_ADA_COMPILER_ARG1@")
+set(CMAKE_ADA_COMPILER_ID "@CMAKE_ADA_COMPILER_ID@")
+set(CMAKE_ADA_COMPILER_VERSION "@CMAKE_ADA_COMPILER_VERSION@")
+set(CMAKE_ADA_PLATFORM_ID "@CMAKE_ADA_PLATFORM_ID@")
+set(CMAKE_AR "@CMAKE_AR@")
+#set(CMAKE_RANLIB "@CMAKE_RANLIB@")
+#set(CMAKE_LINKER "@CMAKE_LINKER@")
+set(CMAKE_ADA_COMPILER_LOADED TRUE)
+set(CMAKE_ADA_COMPILER_WORKS @CMAKE_ADA_COMPILER_WORKS@)
+#set(CMAKE_ADA_ABI_COMPILED @CMAKE_ADA_ABI_COMPILED@)
+
+set(CMAKE_ADA_COMPILER_ENV_VAR "ADA")
+
+set(CMAKE_ADA_COMPILER_ID_RUN TRUE)
+set(CMAKE_ADA_SOURCE_FILE_EXTENSIONS adb;ADB)
+set(CMAKE_ADA_IGNORE_EXTENSIONS ;o;O;obj;OBJ;ali)
+
+set(CMAKE_ADA_BINDER_HELPER "@CMAKE_ADA_BINDER_HELPER@")
+set(CMAKE_ADA_COMPILER_HELPER "@CMAKE_ADA_COMPILER_HELPER@")
+set(CMAKE_ADA_EXE_LINK_HELPER "@CMAKE_ADA_EXE_LINK_HELPER@")
+set(CMAKE_ADA_SHARED_LINK_HELPER "@CMAKE_ADA_SHARED_LINK_HELPER@")
+set(CMAKE_ADA_STATIC_LINK_HELPER "@CMAKE_ADA_STATIC_LINK_HELPER@")
diff --git a/contrib/ada/cmake/Modules/CMakeADAInformation.cmake b/contrib/ada/cmake/Modules/CMakeADAInformation.cmake
new file mode 100644
index 0000000..70755fa
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeADAInformation.cmake
@@ -0,0 +1,149 @@
+include(CMakeLanguageInformation)
+
+set(CMAKE_ADA_OUTPUT_EXTENSION .o)
+set(CMAKE_ADA_OUTPUT_EXTENSION_REPLACE TRUE)
+
+if(CMAKE_USER_MAKE_RULES_OVERRIDE)
+ include(${CMAKE_USER_MAKE_RULES_OVERRIDE} RESULT_VARIABLE _override)
+ set(CMAKE_USER_MAKE_RULES_OVERRIDE "${_override}")
+endif(CMAKE_USER_MAKE_RULES_OVERRIDE)
+
+
+if(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA)
+ include(${CMAKE_USER_MAKE_RULES_OVERRIDE_ADA} RESULT_VARIABLE _override)
+ set(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA "${_override}")
+endif(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA)
+
+set(CMAKE_ADA_FLAGS_INIT "$ENV{ADAFLAGS} ${CMAKE_ADA_FLAGS_INIT}")
+
+string(APPEND CMAKE_ADA_FLAGS_INIT " ")
+string(APPEND CMAKE_ADA_FLAGS_DEBUG_INIT " -g")
+string(APPEND CMAKE_ADA_FLAGS_MINSIZEREL_INIT " -Os")
+string(APPEND CMAKE_ADA_FLAGS_RELEASE_INIT " -O3")
+string(APPEND CMAKE_ADA_FLAGS_RELWITHDEBINFO_INIT " -O2 -g")
+
+cmake_initialize_per_config_variable(CMAKE_ADA_FLAGS "Flags used by the Ada compiler")
+
+if(CMAKE_ADA_STANDARD_LIBRARIES_INIT)
+ set(CMAKE_ADA_STANDARD_LIBRARIES
+ "${CMAKE_ADA_STANDARD_LIBRARIES_INIT}"
+ CACHE
+ STRING "Libraries linked by default with all Ada applications.")
+ mark_as_advanced(CMAKE_ADA_STANDARD_LIBRARIES)
+endif(CMAKE_ADA_STANDARD_LIBRARIES_INIT)
+
+if(NOT CMAKE_ADA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_COMPILER_LAUNCHER})
+ set(CMAKE_ADA_COMPILER_LAUNCHER
+ "$ENV{CMAKE_ADA_COMPILER_LAUNCHER}"
+ CACHE
+ STRING "Compiler launcher for Ada.")
+endif(NOT CMAKE_ADA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_COMPILER_LAUNCHER})
+
+if(NOT CMAKE_ADA_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_LINKER_LAUNCHER})
+ set(CMAKE_ADA_LINKER_LAUNCHER
+ "$ENV{CMAKE_ADA_LINKER_LAUNCHER}"
+ CACHE
+ STRING "Linker launcher for Ada.")
+endif(NOT CMAKE_ADA_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_LINKER_LAUNCHER})
+
+include(CMakeCommonLanguageInclude)
+_cmake_common_language_platform_flags(ADA)
+
+if(NOT CMAKE_ADA_CREATE_SHARED_LIBRARY)
+ set(CMAKE_ADA_CREATE_SHARED_LIBRARY
+ "${CMAKE_ADA_BINDER_HELPER} <CMAKE_ADA_COMPILER> <OBJECTS> FLAGS <FLAGS> <LINK_FLAGS>"
+ "${CMAKE_ADA_SHARED_LINK_HELPER} <CMAKE_ADA_COMPILER> <TARGET> <OBJECTS> <LINK_LIBRARIES>")
+endif(NOT CMAKE_ADA_CREATE_SHARED_LIBRARY)
+
+if(NOT CMAKE_ADA_CREATE_STATIC_LIBRARY)
+ set(CMAKE_ADA_CREATE_STATIC_LIBRARY
+ "${CMAKE_ADA_STATIC_LINK_HELPER} ${CMAKE_AR} <TARGET> <OBJECTS>")
+endif(NOT CMAKE_ADA_CREATE_STATIC_LIBRARY)
+# create a C shared module just copy the shared library rule
+#if(NOT CMAKE_C_CREATE_SHARED_MODULE)
+# set(CMAKE_C_CREATE_SHARED_MODULE ${CMAKE_C_CREATE_SHARED_LIBRARY})
+#endif()
+
+# Create a static archive incrementally for large object file counts.
+# If CMAKE_C_CREATE_STATIC_LIBRARY is set it will override these.
+#if(NOT DEFINED CMAKE_C_ARCHIVE_CREATE)
+# set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
+#endif()
+#if(NOT DEFINED CMAKE_C_ARCHIVE_APPEND)
+# set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
+#endif()
+#if(NOT DEFINED CMAKE_C_ARCHIVE_FINISH)
+# set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
+#endif()
+
+if(NOT CMAKE_ADA_COMPILE_OBJECT)
+ set(CMAKE_ADA_COMPILE_OBJECT
+ "${CMAKE_ADA_COMPILER_HELPER} <CMAKE_ADA_COMPILER> <OBJECT_DIR> <SOURCE> <FLAGS>")
+endif(NOT CMAKE_ADA_COMPILE_OBJECT)
+
+if(NOT CMAKE_ADA_LINK_EXECUTABLE)
+ set(CMAKE_ADA_LINK_EXECUTABLE
+ "${CMAKE_ADA_BINDER_HELPER} <CMAKE_ADA_COMPILER> <OBJECTS> FLAGS <FLAGS> <LINK_FLAGS>"
+ "${CMAKE_ADA_EXE_LINK_HELPER} <CMAKE_ADA_COMPILER> <TARGET> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> OBJ <OBJECTS> LIBS <LINK_LIBRARIES>")
+endif(NOT CMAKE_ADA_LINK_EXECUTABLE)
+
+function(ada_add_executable)
+ if(ARGC GREATER 1)
+ math(EXPR last_index "${ARGC} - 1")
+ foreach(source RANGE 1 ${last_index})
+ list(APPEND SOURCES ${ARGV${source}})
+ string(REPLACE ".adb" "" ali "${ARGV${source}}")
+ set(clean_file "CMakeFiles/${ARGV0}.dir/${ali}.ali")
+ list(APPEND CLEAN_FILES ${clean_file})
+ list(APPEND CLEAN_FILES b~${ali}.adb)
+ list(APPEND CLEAN_FILES b~${ali}.ads)
+ list(APPEND CLEAN_FILES b~${ali}.ali)
+ list(APPEND CLEAN_FILES b~${ali}.o)
+ endforeach(source RANGE 1 ${ARGC})
+
+ add_executable(${ARGV0} ${ARGV1} ${SOURCES})
+
+ set_target_properties(${ARGV0}
+ PROPERTIES
+ ADDITIONAL_CLEAN_FILES "${CLEAN_FILES}")
+ endif(ARGC GREATER 1)
+endfunction(ada_add_executable)
+
+function(ada_add_library)
+ if(ARGC GREATER 2)
+ math(EXPR last_index "${ARGC} - 1")
+ foreach(source RANGE 2 ${last_index})
+ list(APPEND SOURCES ${ARGV${source}})
+ string(REPLACE ".adb" "" ali "${ARGV${source}}")
+ set(clean_file "CMakeFiles/${ARGV0}.dir/${ali}.ali")
+ list(APPEND CLEAN_FILES ${clean_file})
+ list(APPEND CLEAN_FILES b~${ali}.adb)
+ list(APPEND CLEAN_FILES b~${ali}.ads)
+ list(APPEND CLEAN_FILES b~${ali}.ali)
+ list(APPEND CLEAN_FILES b~${ali}.o)
+ endforeach(source RANGE 2 ${ARGC})
+
+ add_library(${ARGV0} ${ARGV1} ${SOURCES})
+
+ set_target_properties(${ARGV0}
+ PROPERTIES
+ ADDITIONAL_CLEAN_FILES "${CLEAN_FILES};dummylib.adb;dummylib.ali;dummylib.o"
+ ALI_FLAG "-aO${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${ARGV0}.dir/")
+ endif(ARGC GREATER 2)
+endfunction(ada_add_library)
+
+function(ada_find_ali)
+ get_target_property(link_libs ${ARGV0} LINK_LIBRARIES)
+
+ foreach(lib IN LISTS link_libs)
+ get_target_property(ali ${lib} ALI_FLAG)
+ string(APPEND FLAGS ${ali} " ")
+ unset(ali)
+ endforeach(lib IN LISTS link_libs)
+
+ set_target_properties(${ARGV0}
+ PROPERTIES
+ LINK_FLAGS ${FLAGS})
+endfunction(ada_find_ali)
+
+set(CMAKE_ADA_INFORMATION_LOADED TRUE)
diff --git a/contrib/ada/cmake/Modules/CMakeDetermineADACompiler.cmake b/contrib/ada/cmake/Modules/CMakeDetermineADACompiler.cmake
new file mode 100644
index 0000000..1562a6c
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeDetermineADACompiler.cmake
@@ -0,0 +1,33 @@
+include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake)
+
+# Load system-specific compiler preferences for this language.
+include(Platform/${CMAKE_SYSTEM_NAME}-Determine-Ada OPTIONAL)
+include(Platform/${CMAKE_SYSTEM_NAME}-Ada OPTIONAL)
+
+if(NOT CMAKE_ADA_COMPILER_NAMES)
+ set(CMAKE_ADA_COMPILER_NAMES gnat)
+
+ foreach(ver RANGE 11 99)
+ list(APPEND CMAKE_ADA_COMPILER_NAMES gnat-${ver})
+ endforeach(ver RANGE 11 99)
+endif(NOT CMAKE_ADA_COMPILER_NAMES)
+
+if(NOT CMAKE_ADA_COMPILER)
+ set(CMAKE_ADA_COMPILER_INIT NOTFOUND)
+ _cmake_find_compiler(ADA)
+else(NOT CMAKE_REAL_ADA_COMPILER)
+ _cmake_find_compiler_path(ADA)
+endif(NOT CMAKE_ADA_COMPILER)
+
+mark_as_advanced(CMAKE_ADA_COMPILER)
+set(CMAKE_ADA_COMPILER_ID "GNU")
+set(CMAKE_ADA_BINDER_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/binder_helper.cmake")
+set(CMAKE_ADA_COMPILER_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compile_helper.cmake")
+set(CMAKE_ADA_EXE_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/exe_link_helper.cmake")
+set(CMAKE_ADA_SHARED_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/shared_link_helper.cmake")
+set(CMAKE_ADA_STATIC_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/static_link_helper.cmake")
+
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CMakeADACompiler.cmake.in
+ ${CMAKE_PLATFORM_INFO_DIR}/CMakeADACompiler.cmake
+ @ONLY)
diff --git a/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake b/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake
new file mode 100644
index 0000000..889c93c
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake
@@ -0,0 +1,46 @@
+include(CMakeTestCompilerCommon)
+unset(CMAKE_ADA_COMPILER_WORKS CACHE)
+
+if(NOT CMAKE_ADA_COMPILER_WORKS)
+ PrintTestCompilerStatus("ADA" "")
+ set(_ADA_TEST_FILE "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CMakeTmp/main.adb")
+
+ file(WRITE ${_ADA_TEST_FILE}
+ "with Ada.Text_IO; use Ada.Text_IO;\n"
+ "\n"
+ "procedure main is\n"
+ "begin\n"
+ "Put_Line(\"Hello, World!\");\n"
+ "end Main;\n")
+
+ try_compile(CMAKE_ADA_COMPILER_WORKS ${CMAKE_BINARY_DIR}
+ ${_ADA_TEST_FILE}
+ OUTPUT_VARIABLE __CMAKE_ADA_COMPILER_OUTPUT)
+
+ set(CMAKE_ADA_COMPILER_WORKS ${CMAKE_ADA_COMPILER_WORKS})
+ unset(CMAKE_ADA_COMPILER_WORKS CACHE)
+ set(ADA_TEST_WAS_RUN TRUE)
+endif(NOT CMAKE_ADA_COMPILER_WORKS)
+
+if(NOT CMAKE_ADA_COMPILER_WORKS)
+ PrintTestCompilerStatus("ADA" " -- broken")
+
+ file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+ "Determining if the Ada compiler works failed with "
+ "the following output:\n${__CMAKE_ADA_COMPILER_OUTPUT}\n\n")
+
+ message(FATAL_ERROR "The Ada compiler \"${CMAKE_ADA_COMPILER}\" "
+ "is not able to compile a simple test program.\nIt fails "
+ "with the following output:\n ${__CMAKE_ADA_COMPILER_OUTPUT}\n\n"
+ "CMake will not be able to correctly generate this project.")
+else(NOT CMAKE_ADA_COMPILER_WORKS)
+ if(ADA_TEST_WAS_RUN)
+ PrintTestCompilerStatus("ADA" " -- works")
+
+ file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+ "Determining if the Ada compiler works passed with "
+ "the following output:\n${__CMAKE_ADA_COMPILER_OUTPUT}\n\n")
+ endif(ADA_TEST_WAS_RUN)
+endif(NOT CMAKE_ADA_COMPILER_WORKS)
+
+unset(__CMAKE_ADA_COMPILER_OUTPUT)
diff --git a/contrib/ada/cmake/binder_helper.cmake b/contrib/ada/cmake/binder_helper.cmake
new file mode 100644
index 0000000..cc70d7c
--- /dev/null
+++ b/contrib/ada/cmake/binder_helper.cmake
@@ -0,0 +1,41 @@
+#CMAKE_ARGV0 = /path/to/cmake
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = path/to/this/file
+#CMAKE_ARGV3 = binder
+#CMAKE_ARGV4 = ali
+
+if(NOT CMAKE_ARGV3)
+ message(FATAL_ERROR "binder not set")
+endif(NOT CMAKE_ARGV3)
+
+string(REPLACE ".o" ".ali" ALI ${CMAKE_ARGV4})
+
+set (REACHED_FLAGS FALSE)
+#iterate over additional objects, only the main one is needed
+foreach(arg RANGE 5 ${CMAKE_ARGC})
+ if(CMAKE_ARGV${arg} STREQUAL FLAGS)
+ set(REACHED_FLAGS TRUE)
+ continue()
+ endif(CMAKE_ARGV${arg} STREQUAL FLAGS)
+
+ if(REACHED_FLAGS)
+ list(APPEND FLAGS ${CMAKE_ARGV${arg}})
+ endif(REACHED_FLAGS)
+endforeach(arg RANGE 5 CMAKE_ARGC)
+
+#first see if there is a main function
+execute_process(COMMAND ${CMAKE_ARGV3} bind ${ALI} ${FLAGS}
+ RESULT_VARIABLE MAIN_RESULT
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+
+if(MAIN_RESULT)
+ execute_process(COMMAND ${CMAKE_ARGV3} bind -n ${ALI} ${FLAGS}
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+endif(MAIN_RESULT)
+
+if(RESULT)
+ message(FATAL_ERROR ${RESULT} ${ERROR})
+endif(RESULT)
diff --git a/contrib/ada/cmake/compile_helper.cmake b/contrib/ada/cmake/compile_helper.cmake
new file mode 100644
index 0000000..fe4821e
--- /dev/null
+++ b/contrib/ada/cmake/compile_helper.cmake
@@ -0,0 +1,32 @@
+#CMAKE_ARGV0 = /path/to/cmake
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = path/to/this/file
+#CMAKE_ARGV3 = compiler
+#CMAKE_ARGV4 = OBJECT-DIR
+#CMAKE_ARGV5 = source-file
+
+if(NOT CMAKE_ARGV3)
+ message(FATAL_ERROR "compiler not set")
+endif(NOT CMAKE_ARGV3)
+
+if(NOT CMAKE_ARGV4)
+ message(FATAL_ERROR "object dir not set")
+endif(NOT CMAKE_ARGV4)
+
+if(NOT CMAKE_ARGV5)
+ message(FATAL_ERROR "source not set")
+endif(NOT CMAKE_ARGV5)
+
+foreach(arg RANGE 6 ${CMAKE_ARGC})
+ list(APPEND FLAGS "${CMAKE_ARGV${arg}}")
+endforeach(arg RANGE 6 ${CMAKE_ARGC})
+
+execute_process(COMMAND ${CMAKE_ARGV3} compile ${FLAGS} ${CMAKE_ARGV5}
+ WORKING_DIRECTORY ${CMAKE_ARGV4}
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+
+if(RESULT)
+ message(FATAL_ERROR ${RESULT} ${ERROR})
+endif(RESULT)
diff --git a/contrib/ada/cmake/exe_link_helper.cmake b/contrib/ada/cmake/exe_link_helper.cmake
new file mode 100644
index 0000000..7937890
--- /dev/null
+++ b/contrib/ada/cmake/exe_link_helper.cmake
@@ -0,0 +1,53 @@
+#CMAKE_ARGV0 = /path/to/cmake
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = path/to/this/file
+#CMAKE_ARGV3 = linker
+#CMAKE_ARGV4 = output-name
+#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
+#CMAKE_ARGVN+1 = LIBS
+#CMAKE_ARGVN+2...CMAKE_ARGVM libraries
+
+if(NOT CMAKE_ARGV3)
+ message(FATAL_ERROR "linker not set")
+endif(NOT CMAKE_ARGV3)
+
+set(REACHED_LIBS FALSE)
+set(REACHED_OBJ FALSE)
+foreach(arg RANGE 5 ${CMAKE_ARGC})
+ if(CMAKE_ARGV${arg} STREQUAL LIBS)
+ set(REACHED_LIBS TRUE)
+ set(REACHED_OBJ FALSE)
+ continue()
+ endif(CMAKE_ARGV${arg} STREQUAL LIBS)
+
+ if(CMAKE_ARGV${arg} STREQUAL OBJ)
+ set(REACHED_LIBS FALSE)
+ set(REACHED_OBJ TRUE)
+ continue()
+ endif(CMAKE_ARGV${arg} STREQUAL OBJ)
+
+ if(CMAKE_ARGC EQUAL arg)
+ continue()
+ endif(CMAKE_ARGC EQUAL arg)
+
+ if(REACHED_LIBS)
+ list(APPEND LIBS "${CMAKE_ARGV${arg}}")
+ elseif(REACHED_OBJ AND NOT ALI)
+ string(REPLACE ".o" ".ali" ALI "${CMAKE_ARGV${arg}}")
+ else(REACHED_LIBS)
+ string(SUBSTRING "${CMAKE_ARGV${arg}}" 0 3 start)
+
+ if(NOT start STREQUAL -aO)
+ list(APPEND FLAGS "${CMAKE_ARGV${arg}}")
+ endif(NOT start STREQUAL -aO)
+ endif(REACHED_LIBS)
+endforeach(arg RANGE 5 ${CMAKE_ARGC})
+
+execute_process(COMMAND ${CMAKE_ARGV3} link ${ALI} -o ${CMAKE_ARGV4} ${FLAGS} ${OTHER_OBJECTS} ${LIBS}
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+
+if(RESULT)
+ message(FATAL_ERROR ${RESULT} ${ERROR})
+endif(RESULT)
diff --git a/contrib/ada/cmake/shared_link_helper.cmake b/contrib/ada/cmake/shared_link_helper.cmake
new file mode 100644
index 0000000..baea9a1
--- /dev/null
+++ b/contrib/ada/cmake/shared_link_helper.cmake
@@ -0,0 +1,52 @@
+#CMAKE_ARGV0 = /path/to/cmake
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = path/to/this/file
+#CMAKE_ARGV3 = linker
+#CMAKE_ARGV4 = output-name
+#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
+#CMAKE_ARGVN+1 = LIBS
+#CMAKE_ARGVN+2...CMAKE_ARGVM libraries
+
+if(NOT CMAKE_ARGV3)
+ message(FATAL_ERROR "linker not set")
+endif(NOT CMAKE_ARGV3)
+
+set(REACHED_FILES FALSE)
+foreach(arg RANGE 5 ${CMAKE_ARGC})
+ if(CMAKE_ARGV${arg} STREQUAL "LIBS")
+ set(REACHED_FILES TRUE)
+ continue()
+ endif(CMAKE_ARGV${arg} STREQUAL "LIBS")
+
+ if(CMAKE_ARGC EQUAL arg)
+ continue()
+ endif(CMAKE_ARGC EQUAL arg)
+
+ if(REACHED_LIBS)
+ list(APPEND LIBS "${CMAKE_ARGV${arg}} ")
+ else(REACHED_LIBS)
+ list(APPEND OBJECT_FILES "${CMAKE_ARGV${arg}}")
+ endif(REACHED_LIBS)
+endforeach(arg RANGE 5 ${CMAKE_ARGC})
+
+file(WRITE dummylib.adb
+ "procedure dummylib is\n"
+ "begin\n"
+ " null;\n"
+ "end;\n")
+
+execute_process(COMMAND ${CMAKE_ARGV3} compile -fPIC dummylib.adb
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+execute_process(COMMAND ${CMAKE_ARGV3} bind -n dummylib.ali
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+
+execute_process(COMMAND ${CMAKE_ARGV3} link -shared dummylib.ali -o ${CMAKE_ARGV4} ${OBJECT_FILES} ${LIBS}
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+
+if(RESULT)
+ message(FATAL_ERROR ${RESULT} ${ERROR})
+endif(RESULT)
diff --git a/contrib/ada/cmake/static_link_helper.cmake b/contrib/ada/cmake/static_link_helper.cmake
new file mode 100644
index 0000000..eb3ff2b
--- /dev/null
+++ b/contrib/ada/cmake/static_link_helper.cmake
@@ -0,0 +1,25 @@
+#CMAKE_ARGV0 = /path/to/cmake
+#CMAKE_ARGV1 = -P
+#CMAKE_ARGV2 = path/to/this/file
+#CMAKE_ARGV3 = path/to/ar
+#CMAKE_ARGV4 = output-name
+#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
+
+if(NOT CMAKE_ARGV3)
+ message(FATAL_ERROR "linker not set")
+endif(NOT CMAKE_ARGV3)
+
+foreach(arg RANGE 5 ${CMAKE_ARGC})
+ if(NOT CMAKE_ARGC EQUAL arg)
+ list(APPEND OBJECT_FILES "${CMAKE_ARGV${arg}}")
+ endif(NOT CMAKE_ARGC EQUAL arg)
+endforeach(arg RANGE 6 ${CMAKE_ARGC})
+
+execute_process(COMMAND ${CMAKE_ARGV3} rcs ${CMAKE_ARGV4} ${OBJECT_FILES}
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE dont_care
+ ERROR_VARIABLE ERROR)
+
+if(RESULT)
+ message(FATAL_ERROR ${RESULT} ${ERROR})
+endif(RESULT)