aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/CMakeLists.txt8
-rw-r--r--contrib/ada/CMakeLists.txt214
-rw-r--r--contrib/ada/cmake/Modules/CMakeADACompiler.cmake.in23
-rw-r--r--contrib/ada/cmake/Modules/CMakeADAInformation.cmake149
-rw-r--r--contrib/ada/cmake/Modules/CMakeDetermineADACompiler.cmake33
-rw-r--r--contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake46
-rw-r--r--contrib/ada/cmake/binder_helper.cmake41
-rw-r--r--contrib/ada/cmake/compile_helper.cmake32
-rw-r--r--contrib/ada/cmake/exe_link_helper.cmake53
-rw-r--r--contrib/ada/cmake/shared_link_helper.cmake52
-rw-r--r--contrib/ada/cmake/static_link_helper.cmake25
11 files changed, 676 insertions, 0 deletions
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index 94e28757..cc4b3310 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -1,5 +1,13 @@
1option(ZLIB_BUILD_ADA "Enable building of Ada bindings" OFF)
1option(ZLIB_BUILD_MINIZIP "Enable building libminizip contrib library" OFF) 2option(ZLIB_BUILD_MINIZIP "Enable building libminizip contrib library" OFF)
2 3
4if(ZLIB_BUILD_ADA)
5 set(ZLIBADA_BUILD_SHARED ${ZLIB_BUILD_SHARED})
6 set(ZLIBADA_BUILD_STATIC ${ZLIB_BUILD_STATIC})
7 set(ZLIBADA_BUILD_TESTING ${ZLIB_BUILD_TESTING})
8 add_subdirectory(ada/)
9endif(ZLIB_BUILD_ADA)
10
3if(ZLIB_BUILD_MINIZIP) 11if(ZLIB_BUILD_MINIZIP)
4 set(MINIZIP_BUILD_SHARED ${ZLIB_BUILD_SHARED}) 12 set(MINIZIP_BUILD_SHARED ${ZLIB_BUILD_SHARED})
5 set(MINIZIP_BUILD_STATIC ${ZLIB_BUILD_STATIC}) 13 set(MINIZIP_BUILD_STATIC ${ZLIB_BUILD_STATIC})
diff --git a/contrib/ada/CMakeLists.txt b/contrib/ada/CMakeLists.txt
new file mode 100644
index 00000000..98f7b978
--- /dev/null
+++ b/contrib/ada/CMakeLists.txt
@@ -0,0 +1,214 @@
1cmake_minimum_required(VERSION 3.12...3.31)
2
3set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
4
5project(
6 zlibAda
7 VERSION 1.0.0
8 LANGUAGES ADA
9 DESCRIPTION "A library for creating zipfiles based in zlib"
10 HOMEPAGE_URL "https://www.zlib.net")
11
12option(ZLIBADA_BUILD_SHARED "Enable building ada bindings shared library" ON)
13option(ZLIBADA_BUILD_STATIC "Enable building ada bindings static library" ON)
14option(ZLIBADA_BUILD_TESTING "Enable building tests for ada bindings library" ON)
15
16if(WIN32 OR CYGWIN)
17 set(zlibAda_static_suffix "s")
18 set(CMAKE_DEBUG_POSTFIX "d")
19endif(WIN32 OR CYGWIN)
20
21if(NOT DEFINED ZLIB_BUILD_ADA)
22 if(ZLIBADA_BUILD_SHARED)
23 list(APPEND REQUIRED_COMPONENTS "shared")
24 endif(ZLIBADA_BUILD_SHARED)
25
26 if(ZLIBADA_BUILD_STATIC)
27 list(APPEND REQUIRED_COMPONENTS "static")
28 endif(ZLIB_BUILD_STATIC)
29
30 find_package(ZLIB REQUIRED COMPONENTS ${REQUIRED_COMPONENTS} CONFIG)
31endif(NOT DEFINED ZLIB_BUILD_ADA)
32
33function(ZLIBADA_findTestEnv testName)
34 set(testEnv "PATH=")
35
36 if(MSVC OR MINGW)
37 set(separator "\\\;")
38 else()
39 set(separator ":")
40 endif()
41
42 string(APPEND testEnv "$<TARGET_FILE_DIR:ZLIB::ZLIB>${separator}")
43 string(APPEND testEnv "$ENV{PATH}")
44
45 set_tests_properties(${testName} PROPERTIES ENVIRONMENT "${testEnv}")
46endfunction(ZLIBADA_findTestEnv testName)
47
48if(ZLIBADA_BUILD_SHARED)
49 ada_add_library(zlib-Ada SHARED
50 zlib-thin.adb
51 zlib.adb)
52
53 target_link_libraries(zlib-Ada
54 INTERFACE ZLIB::ZLIB)
55
56 ada_add_library(zlib-streams SHARED
57 zlib-streams.adb)
58
59 target_link_libraries(zlib-streams
60 PUBLIC
61 zlib-Ada)
62
63 ada_find_ali(zlib-streams)
64
65 if(ZLIBADA_BUILD_TESTING)
66 enable_testing()
67 ada_add_executable(ada-test test.adb)
68
69 target_link_libraries(ada-test
70 PRIVATE
71 zlib-Ada
72 zlib-streams)
73
74 ada_find_ali(ada-test)
75
76 add_test(NAME zlibAda_ada-test COMMAND ada-test)
77 set_tests_properties(zlibAda_ada-test PROPERTIES FIXTURES_REQUIRED ada_cleanup)
78
79 if(MSVC
80 OR MSYS
81 OR MINGW
82 OR CYGWIN)
83 zlibada_findtestenv(zlibAda_ada-test)
84 endif(
85 MSVC
86 OR MSYS
87 OR MINGW
88 OR CYGWIN)
89
90 ada_add_executable(buffer_demo buffer_demo.adb)
91
92 target_link_libraries(buffer_demo
93 PRIVATE
94 zlib-Ada)
95
96 ada_find_ali(buffer_demo)
97
98 add_test(NAME zlibAda_buffer-demo COMMAND buffer_demo)
99
100 if(MSVC
101 OR MSYS
102 OR MINGW
103 OR CYGWIN)
104 zlibada_findtestenv(zlibAda_buffer-demo)
105 endif(
106 MSVC
107 OR MSYS
108 OR MINGW
109 OR CYGWIN)
110
111 ada_add_executable(mtest mtest.adb)
112
113 target_link_libraries(mtest
114 PRIVATE
115 zlib-Ada)
116
117 ada_find_ali(mtest)
118
119 #Not adding test as this is an endless-loop
120
121 ada_add_executable(read read.adb)
122
123 target_link_libraries(read
124 PRIVATE
125 zlib-Ada)
126
127 ada_find_ali(read)
128
129 add_test(NAME zlibAda_read COMMAND read)
130
131 if(MSVC
132 OR MSYS
133 OR MINGW
134 OR CYGWIN)
135 zlibada_findtestenv(zlibAda_read)
136 endif(
137 MSVC
138 OR MSYS
139 OR MINGW
140 OR CYGWIN)
141 endif(ZLIBADA_BUILD_TESTING)
142endif(ZLIBADA_BUILD_SHARED)
143
144if(ZLIBADA_BUILD_STATIC)
145 ada_add_library(zlib-AdaStatic STATIC
146 zlib-thin.adb
147 zlib.adb)
148
149 target_link_libraries(zlib-AdaStatic
150 INTERFACE ZLIB::ZLIBSTATIC)
151
152 set_target_properties(zlib-AdaStatic
153 PROPERTIES OUTPUT_NAME zlib-Ada${zlibAda_static_suffix})
154
155 ada_add_library(zlib-streamsStatic STATIC
156 zlib-streams.adb)
157
158 target_link_libraries(zlib-streamsStatic
159 PUBLIC
160 zlib-AdaStatic)
161
162 ada_find_ali(zlib-streamsStatic)
163
164 if(ZLIBADA_BUILD_TESTING)
165 enable_testing()
166 ada_add_executable(ada-testStatic test.adb)
167
168 target_link_libraries(ada-testStatic
169 PRIVATE
170 zlib-AdaStatic
171 zlib-streamsStatic)
172
173 ada_find_ali(ada-testStatic)
174
175 add_test(NAME zlibAda_ada-testStatic COMMAND ada-testStatic)
176 set_tests_properties(zlibAda_ada-testStatic PROPERTIES FIXTURES_REQUIRED ada_cleanup)
177
178 ada_add_executable(buffer_demoStatic buffer_demo.adb)
179
180 target_link_libraries(buffer_demoStatic
181 PRIVATE
182 zlib-AdaStatic)
183
184 ada_find_ali(buffer_demoStatic)
185
186 add_test(NAME zlibAda-buffer-demoStatic COMMAND buffer_demoStatic)
187
188 ada_add_executable(mtestStatic mtest.adb)
189
190 target_link_libraries(mtestStatic
191 PRIVATE
192 zlib-AdaStatic)
193
194 ada_find_ali(mtestStatic)
195
196 # Not adding test as this is an endless-loop
197
198 ada_add_executable(readStatic read.adb)
199
200 target_link_libraries(readStatic
201 PRIVATE
202 zlib-AdaStatic)
203
204 ada_find_ali(readStatic)
205
206 add_test(NAME zlibAda_readStatic COMMAND readStatic)
207 endif(ZLIBADA_BUILD_TESTING)
208endif(ZLIBADA_BUILD_STATIC)
209
210if(ZLIBADA_BUILD_TESTING)
211 add_test(NAME zlibAda_cleanup COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_BINARY_DIR}/testzlib.in
212 ${CMAKE_CURRENT_BINARY_DIR}/testzlib.out ${CMAKE_CURRENT_BINARY_DIR}/testzlib.zlb)
213 set_tests_properties(zlibAda_cleanup PROPERTIES FIXTURES_CLEANUP ada_cleanup)
214endif(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 00000000..a3a4086b
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeADACompiler.cmake.in
@@ -0,0 +1,23 @@
1set(CMAKE_ADA_COMPILER "@CMAKE_ADA_COMPILER@")
2set(CMAKE_ADA_COMPILER_ARG1 "@CMAKE_ADA_COMPILER_ARG1@")
3set(CMAKE_ADA_COMPILER_ID "@CMAKE_ADA_COMPILER_ID@")
4set(CMAKE_ADA_COMPILER_VERSION "@CMAKE_ADA_COMPILER_VERSION@")
5set(CMAKE_ADA_PLATFORM_ID "@CMAKE_ADA_PLATFORM_ID@")
6set(CMAKE_AR "@CMAKE_AR@")
7#set(CMAKE_RANLIB "@CMAKE_RANLIB@")
8#set(CMAKE_LINKER "@CMAKE_LINKER@")
9set(CMAKE_ADA_COMPILER_LOADED TRUE)
10set(CMAKE_ADA_COMPILER_WORKS @CMAKE_ADA_COMPILER_WORKS@)
11#set(CMAKE_ADA_ABI_COMPILED @CMAKE_ADA_ABI_COMPILED@)
12
13set(CMAKE_ADA_COMPILER_ENV_VAR "ADA")
14
15set(CMAKE_ADA_COMPILER_ID_RUN TRUE)
16set(CMAKE_ADA_SOURCE_FILE_EXTENSIONS adb;ADB)
17set(CMAKE_ADA_IGNORE_EXTENSIONS ;o;O;obj;OBJ;ali)
18
19set(CMAKE_ADA_BINDER_HELPER "@CMAKE_ADA_BINDER_HELPER@")
20set(CMAKE_ADA_COMPILER_HELPER "@CMAKE_ADA_COMPILER_HELPER@")
21set(CMAKE_ADA_EXE_LINK_HELPER "@CMAKE_ADA_EXE_LINK_HELPER@")
22set(CMAKE_ADA_SHARED_LINK_HELPER "@CMAKE_ADA_SHARED_LINK_HELPER@")
23set(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 00000000..70755fa0
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeADAInformation.cmake
@@ -0,0 +1,149 @@
1include(CMakeLanguageInformation)
2
3set(CMAKE_ADA_OUTPUT_EXTENSION .o)
4set(CMAKE_ADA_OUTPUT_EXTENSION_REPLACE TRUE)
5
6if(CMAKE_USER_MAKE_RULES_OVERRIDE)
7 include(${CMAKE_USER_MAKE_RULES_OVERRIDE} RESULT_VARIABLE _override)
8 set(CMAKE_USER_MAKE_RULES_OVERRIDE "${_override}")
9endif(CMAKE_USER_MAKE_RULES_OVERRIDE)
10
11
12if(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA)
13 include(${CMAKE_USER_MAKE_RULES_OVERRIDE_ADA} RESULT_VARIABLE _override)
14 set(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA "${_override}")
15endif(CMAKE_USER_MAKE_RULES_OVERRIDE_ADA)
16
17set(CMAKE_ADA_FLAGS_INIT "$ENV{ADAFLAGS} ${CMAKE_ADA_FLAGS_INIT}")
18
19string(APPEND CMAKE_ADA_FLAGS_INIT " ")
20string(APPEND CMAKE_ADA_FLAGS_DEBUG_INIT " -g")
21string(APPEND CMAKE_ADA_FLAGS_MINSIZEREL_INIT " -Os")
22string(APPEND CMAKE_ADA_FLAGS_RELEASE_INIT " -O3")
23string(APPEND CMAKE_ADA_FLAGS_RELWITHDEBINFO_INIT " -O2 -g")
24
25cmake_initialize_per_config_variable(CMAKE_ADA_FLAGS "Flags used by the Ada compiler")
26
27if(CMAKE_ADA_STANDARD_LIBRARIES_INIT)
28 set(CMAKE_ADA_STANDARD_LIBRARIES
29 "${CMAKE_ADA_STANDARD_LIBRARIES_INIT}"
30 CACHE
31 STRING "Libraries linked by default with all Ada applications.")
32 mark_as_advanced(CMAKE_ADA_STANDARD_LIBRARIES)
33endif(CMAKE_ADA_STANDARD_LIBRARIES_INIT)
34
35if(NOT CMAKE_ADA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_COMPILER_LAUNCHER})
36 set(CMAKE_ADA_COMPILER_LAUNCHER
37 "$ENV{CMAKE_ADA_COMPILER_LAUNCHER}"
38 CACHE
39 STRING "Compiler launcher for Ada.")
40endif(NOT CMAKE_ADA_COMPILER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_COMPILER_LAUNCHER})
41
42if(NOT CMAKE_ADA_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_LINKER_LAUNCHER})
43 set(CMAKE_ADA_LINKER_LAUNCHER
44 "$ENV{CMAKE_ADA_LINKER_LAUNCHER}"
45 CACHE
46 STRING "Linker launcher for Ada.")
47endif(NOT CMAKE_ADA_LINKER_LAUNCHER AND DEFINED ENV{CMAKE_ADA_LINKER_LAUNCHER})
48
49include(CMakeCommonLanguageInclude)
50_cmake_common_language_platform_flags(ADA)
51
52if(NOT CMAKE_ADA_CREATE_SHARED_LIBRARY)
53 set(CMAKE_ADA_CREATE_SHARED_LIBRARY
54 "${CMAKE_ADA_BINDER_HELPER} <CMAKE_ADA_COMPILER> <OBJECTS> FLAGS <FLAGS> <LINK_FLAGS>"
55 "${CMAKE_ADA_SHARED_LINK_HELPER} <CMAKE_ADA_COMPILER> <TARGET> <OBJECTS> <LINK_LIBRARIES>")
56endif(NOT CMAKE_ADA_CREATE_SHARED_LIBRARY)
57
58if(NOT CMAKE_ADA_CREATE_STATIC_LIBRARY)
59 set(CMAKE_ADA_CREATE_STATIC_LIBRARY
60 "${CMAKE_ADA_STATIC_LINK_HELPER} ${CMAKE_AR} <TARGET> <OBJECTS>")
61endif(NOT CMAKE_ADA_CREATE_STATIC_LIBRARY)
62# create a C shared module just copy the shared library rule
63#if(NOT CMAKE_C_CREATE_SHARED_MODULE)
64# set(CMAKE_C_CREATE_SHARED_MODULE ${CMAKE_C_CREATE_SHARED_LIBRARY})
65#endif()
66
67# Create a static archive incrementally for large object file counts.
68# If CMAKE_C_CREATE_STATIC_LIBRARY is set it will override these.
69#if(NOT DEFINED CMAKE_C_ARCHIVE_CREATE)
70# set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
71#endif()
72#if(NOT DEFINED CMAKE_C_ARCHIVE_APPEND)
73# set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> q <TARGET> <LINK_FLAGS> <OBJECTS>")
74#endif()
75#if(NOT DEFINED CMAKE_C_ARCHIVE_FINISH)
76# set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
77#endif()
78
79if(NOT CMAKE_ADA_COMPILE_OBJECT)
80 set(CMAKE_ADA_COMPILE_OBJECT
81 "${CMAKE_ADA_COMPILER_HELPER} <CMAKE_ADA_COMPILER> <OBJECT_DIR> <SOURCE> <FLAGS>")
82endif(NOT CMAKE_ADA_COMPILE_OBJECT)
83
84if(NOT CMAKE_ADA_LINK_EXECUTABLE)
85 set(CMAKE_ADA_LINK_EXECUTABLE
86 "${CMAKE_ADA_BINDER_HELPER} <CMAKE_ADA_COMPILER> <OBJECTS> FLAGS <FLAGS> <LINK_FLAGS>"
87 "${CMAKE_ADA_EXE_LINK_HELPER} <CMAKE_ADA_COMPILER> <TARGET> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> OBJ <OBJECTS> LIBS <LINK_LIBRARIES>")
88endif(NOT CMAKE_ADA_LINK_EXECUTABLE)
89
90function(ada_add_executable)
91 if(ARGC GREATER 1)
92 math(EXPR last_index "${ARGC} - 1")
93 foreach(source RANGE 1 ${last_index})
94 list(APPEND SOURCES ${ARGV${source}})
95 string(REPLACE ".adb" "" ali "${ARGV${source}}")
96 set(clean_file "CMakeFiles/${ARGV0}.dir/${ali}.ali")
97 list(APPEND CLEAN_FILES ${clean_file})
98 list(APPEND CLEAN_FILES b~${ali}.adb)
99 list(APPEND CLEAN_FILES b~${ali}.ads)
100 list(APPEND CLEAN_FILES b~${ali}.ali)
101 list(APPEND CLEAN_FILES b~${ali}.o)
102 endforeach(source RANGE 1 ${ARGC})
103
104 add_executable(${ARGV0} ${ARGV1} ${SOURCES})
105
106 set_target_properties(${ARGV0}
107 PROPERTIES
108 ADDITIONAL_CLEAN_FILES "${CLEAN_FILES}")
109 endif(ARGC GREATER 1)
110endfunction(ada_add_executable)
111
112function(ada_add_library)
113 if(ARGC GREATER 2)
114 math(EXPR last_index "${ARGC} - 1")
115 foreach(source RANGE 2 ${last_index})
116 list(APPEND SOURCES ${ARGV${source}})
117 string(REPLACE ".adb" "" ali "${ARGV${source}}")
118 set(clean_file "CMakeFiles/${ARGV0}.dir/${ali}.ali")
119 list(APPEND CLEAN_FILES ${clean_file})
120 list(APPEND CLEAN_FILES b~${ali}.adb)
121 list(APPEND CLEAN_FILES b~${ali}.ads)
122 list(APPEND CLEAN_FILES b~${ali}.ali)
123 list(APPEND CLEAN_FILES b~${ali}.o)
124 endforeach(source RANGE 2 ${ARGC})
125
126 add_library(${ARGV0} ${ARGV1} ${SOURCES})
127
128 set_target_properties(${ARGV0}
129 PROPERTIES
130 ADDITIONAL_CLEAN_FILES "${CLEAN_FILES};dummylib.adb;dummylib.ali;dummylib.o"
131 ALI_FLAG "-aO${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${ARGV0}.dir/")
132 endif(ARGC GREATER 2)
133endfunction(ada_add_library)
134
135function(ada_find_ali)
136 get_target_property(link_libs ${ARGV0} LINK_LIBRARIES)
137
138 foreach(lib IN LISTS link_libs)
139 get_target_property(ali ${lib} ALI_FLAG)
140 string(APPEND FLAGS ${ali} " ")
141 unset(ali)
142 endforeach(lib IN LISTS link_libs)
143
144 set_target_properties(${ARGV0}
145 PROPERTIES
146 LINK_FLAGS ${FLAGS})
147endfunction(ada_find_ali)
148
149set(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 00000000..1562a6c9
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeDetermineADACompiler.cmake
@@ -0,0 +1,33 @@
1include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake)
2
3# Load system-specific compiler preferences for this language.
4include(Platform/${CMAKE_SYSTEM_NAME}-Determine-Ada OPTIONAL)
5include(Platform/${CMAKE_SYSTEM_NAME}-Ada OPTIONAL)
6
7if(NOT CMAKE_ADA_COMPILER_NAMES)
8 set(CMAKE_ADA_COMPILER_NAMES gnat)
9
10 foreach(ver RANGE 11 99)
11 list(APPEND CMAKE_ADA_COMPILER_NAMES gnat-${ver})
12 endforeach(ver RANGE 11 99)
13endif(NOT CMAKE_ADA_COMPILER_NAMES)
14
15if(NOT CMAKE_ADA_COMPILER)
16 set(CMAKE_ADA_COMPILER_INIT NOTFOUND)
17 _cmake_find_compiler(ADA)
18else(NOT CMAKE_REAL_ADA_COMPILER)
19 _cmake_find_compiler_path(ADA)
20endif(NOT CMAKE_ADA_COMPILER)
21
22mark_as_advanced(CMAKE_ADA_COMPILER)
23set(CMAKE_ADA_COMPILER_ID "GNU")
24set(CMAKE_ADA_BINDER_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/binder_helper.cmake")
25set(CMAKE_ADA_COMPILER_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compile_helper.cmake")
26set(CMAKE_ADA_EXE_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/exe_link_helper.cmake")
27set(CMAKE_ADA_SHARED_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/shared_link_helper.cmake")
28set(CMAKE_ADA_STATIC_LINK_HELPER "${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/static_link_helper.cmake")
29
30configure_file(
31 ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/CMakeADACompiler.cmake.in
32 ${CMAKE_PLATFORM_INFO_DIR}/CMakeADACompiler.cmake
33 @ONLY)
diff --git a/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake b/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake
new file mode 100644
index 00000000..889c93c0
--- /dev/null
+++ b/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake
@@ -0,0 +1,46 @@
1include(CMakeTestCompilerCommon)
2unset(CMAKE_ADA_COMPILER_WORKS CACHE)
3
4if(NOT CMAKE_ADA_COMPILER_WORKS)
5 PrintTestCompilerStatus("ADA" "")
6 set(_ADA_TEST_FILE "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CMakeTmp/main.adb")
7
8 file(WRITE ${_ADA_TEST_FILE}
9 "with Ada.Text_IO; use Ada.Text_IO;\n"
10 "\n"
11 "procedure main is\n"
12 "begin\n"
13 "Put_Line(\"Hello, World!\");\n"
14 "end Main;\n")
15
16 try_compile(CMAKE_ADA_COMPILER_WORKS ${CMAKE_BINARY_DIR}
17 ${_ADA_TEST_FILE}
18 OUTPUT_VARIABLE __CMAKE_ADA_COMPILER_OUTPUT)
19
20 set(CMAKE_ADA_COMPILER_WORKS ${CMAKE_ADA_COMPILER_WORKS})
21 unset(CMAKE_ADA_COMPILER_WORKS CACHE)
22 set(ADA_TEST_WAS_RUN TRUE)
23endif(NOT CMAKE_ADA_COMPILER_WORKS)
24
25if(NOT CMAKE_ADA_COMPILER_WORKS)
26 PrintTestCompilerStatus("ADA" " -- broken")
27
28 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
29 "Determining if the Ada compiler works failed with "
30 "the following output:\n${__CMAKE_ADA_COMPILER_OUTPUT}\n\n")
31
32 message(FATAL_ERROR "The Ada compiler \"${CMAKE_ADA_COMPILER}\" "
33 "is not able to compile a simple test program.\nIt fails "
34 "with the following output:\n ${__CMAKE_ADA_COMPILER_OUTPUT}\n\n"
35 "CMake will not be able to correctly generate this project.")
36else(NOT CMAKE_ADA_COMPILER_WORKS)
37 if(ADA_TEST_WAS_RUN)
38 PrintTestCompilerStatus("ADA" " -- works")
39
40 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
41 "Determining if the Ada compiler works passed with "
42 "the following output:\n${__CMAKE_ADA_COMPILER_OUTPUT}\n\n")
43 endif(ADA_TEST_WAS_RUN)
44endif(NOT CMAKE_ADA_COMPILER_WORKS)
45
46unset(__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 00000000..cc70d7ce
--- /dev/null
+++ b/contrib/ada/cmake/binder_helper.cmake
@@ -0,0 +1,41 @@
1#CMAKE_ARGV0 = /path/to/cmake
2#CMAKE_ARGV1 = -P
3#CMAKE_ARGV2 = path/to/this/file
4#CMAKE_ARGV3 = binder
5#CMAKE_ARGV4 = ali
6
7if(NOT CMAKE_ARGV3)
8 message(FATAL_ERROR "binder not set")
9endif(NOT CMAKE_ARGV3)
10
11string(REPLACE ".o" ".ali" ALI ${CMAKE_ARGV4})
12
13set (REACHED_FLAGS FALSE)
14#iterate over additional objects, only the main one is needed
15foreach(arg RANGE 5 ${CMAKE_ARGC})
16 if(CMAKE_ARGV${arg} STREQUAL FLAGS)
17 set(REACHED_FLAGS TRUE)
18 continue()
19 endif(CMAKE_ARGV${arg} STREQUAL FLAGS)
20
21 if(REACHED_FLAGS)
22 list(APPEND FLAGS ${CMAKE_ARGV${arg}})
23 endif(REACHED_FLAGS)
24endforeach(arg RANGE 5 CMAKE_ARGC)
25
26#first see if there is a main function
27execute_process(COMMAND ${CMAKE_ARGV3} bind ${ALI} ${FLAGS}
28 RESULT_VARIABLE MAIN_RESULT
29 OUTPUT_VARIABLE dont_care
30 ERROR_VARIABLE ERROR)
31
32if(MAIN_RESULT)
33 execute_process(COMMAND ${CMAKE_ARGV3} bind -n ${ALI} ${FLAGS}
34 RESULT_VARIABLE RESULT
35 OUTPUT_VARIABLE dont_care
36 ERROR_VARIABLE ERROR)
37endif(MAIN_RESULT)
38
39if(RESULT)
40 message(FATAL_ERROR ${RESULT} ${ERROR})
41endif(RESULT)
diff --git a/contrib/ada/cmake/compile_helper.cmake b/contrib/ada/cmake/compile_helper.cmake
new file mode 100644
index 00000000..fe4821e3
--- /dev/null
+++ b/contrib/ada/cmake/compile_helper.cmake
@@ -0,0 +1,32 @@
1#CMAKE_ARGV0 = /path/to/cmake
2#CMAKE_ARGV1 = -P
3#CMAKE_ARGV2 = path/to/this/file
4#CMAKE_ARGV3 = compiler
5#CMAKE_ARGV4 = OBJECT-DIR
6#CMAKE_ARGV5 = source-file
7
8if(NOT CMAKE_ARGV3)
9 message(FATAL_ERROR "compiler not set")
10endif(NOT CMAKE_ARGV3)
11
12if(NOT CMAKE_ARGV4)
13 message(FATAL_ERROR "object dir not set")
14endif(NOT CMAKE_ARGV4)
15
16if(NOT CMAKE_ARGV5)
17 message(FATAL_ERROR "source not set")
18endif(NOT CMAKE_ARGV5)
19
20foreach(arg RANGE 6 ${CMAKE_ARGC})
21 list(APPEND FLAGS "${CMAKE_ARGV${arg}}")
22endforeach(arg RANGE 6 ${CMAKE_ARGC})
23
24execute_process(COMMAND ${CMAKE_ARGV3} compile ${FLAGS} ${CMAKE_ARGV5}
25 WORKING_DIRECTORY ${CMAKE_ARGV4}
26 RESULT_VARIABLE RESULT
27 OUTPUT_VARIABLE dont_care
28 ERROR_VARIABLE ERROR)
29
30if(RESULT)
31 message(FATAL_ERROR ${RESULT} ${ERROR})
32endif(RESULT)
diff --git a/contrib/ada/cmake/exe_link_helper.cmake b/contrib/ada/cmake/exe_link_helper.cmake
new file mode 100644
index 00000000..79378909
--- /dev/null
+++ b/contrib/ada/cmake/exe_link_helper.cmake
@@ -0,0 +1,53 @@
1#CMAKE_ARGV0 = /path/to/cmake
2#CMAKE_ARGV1 = -P
3#CMAKE_ARGV2 = path/to/this/file
4#CMAKE_ARGV3 = linker
5#CMAKE_ARGV4 = output-name
6#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
7#CMAKE_ARGVN+1 = LIBS
8#CMAKE_ARGVN+2...CMAKE_ARGVM libraries
9
10if(NOT CMAKE_ARGV3)
11 message(FATAL_ERROR "linker not set")
12endif(NOT CMAKE_ARGV3)
13
14set(REACHED_LIBS FALSE)
15set(REACHED_OBJ FALSE)
16foreach(arg RANGE 5 ${CMAKE_ARGC})
17 if(CMAKE_ARGV${arg} STREQUAL LIBS)
18 set(REACHED_LIBS TRUE)
19 set(REACHED_OBJ FALSE)
20 continue()
21 endif(CMAKE_ARGV${arg} STREQUAL LIBS)
22
23 if(CMAKE_ARGV${arg} STREQUAL OBJ)
24 set(REACHED_LIBS FALSE)
25 set(REACHED_OBJ TRUE)
26 continue()
27 endif(CMAKE_ARGV${arg} STREQUAL OBJ)
28
29 if(CMAKE_ARGC EQUAL arg)
30 continue()
31 endif(CMAKE_ARGC EQUAL arg)
32
33 if(REACHED_LIBS)
34 list(APPEND LIBS "${CMAKE_ARGV${arg}}")
35 elseif(REACHED_OBJ AND NOT ALI)
36 string(REPLACE ".o" ".ali" ALI "${CMAKE_ARGV${arg}}")
37 else(REACHED_LIBS)
38 string(SUBSTRING "${CMAKE_ARGV${arg}}" 0 3 start)
39
40 if(NOT start STREQUAL -aO)
41 list(APPEND FLAGS "${CMAKE_ARGV${arg}}")
42 endif(NOT start STREQUAL -aO)
43 endif(REACHED_LIBS)
44endforeach(arg RANGE 5 ${CMAKE_ARGC})
45
46execute_process(COMMAND ${CMAKE_ARGV3} link ${ALI} -o ${CMAKE_ARGV4} ${FLAGS} ${OTHER_OBJECTS} ${LIBS}
47 RESULT_VARIABLE RESULT
48 OUTPUT_VARIABLE dont_care
49 ERROR_VARIABLE ERROR)
50
51if(RESULT)
52 message(FATAL_ERROR ${RESULT} ${ERROR})
53endif(RESULT)
diff --git a/contrib/ada/cmake/shared_link_helper.cmake b/contrib/ada/cmake/shared_link_helper.cmake
new file mode 100644
index 00000000..baea9a1a
--- /dev/null
+++ b/contrib/ada/cmake/shared_link_helper.cmake
@@ -0,0 +1,52 @@
1#CMAKE_ARGV0 = /path/to/cmake
2#CMAKE_ARGV1 = -P
3#CMAKE_ARGV2 = path/to/this/file
4#CMAKE_ARGV3 = linker
5#CMAKE_ARGV4 = output-name
6#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
7#CMAKE_ARGVN+1 = LIBS
8#CMAKE_ARGVN+2...CMAKE_ARGVM libraries
9
10if(NOT CMAKE_ARGV3)
11 message(FATAL_ERROR "linker not set")
12endif(NOT CMAKE_ARGV3)
13
14set(REACHED_FILES FALSE)
15foreach(arg RANGE 5 ${CMAKE_ARGC})
16 if(CMAKE_ARGV${arg} STREQUAL "LIBS")
17 set(REACHED_FILES TRUE)
18 continue()
19 endif(CMAKE_ARGV${arg} STREQUAL "LIBS")
20
21 if(CMAKE_ARGC EQUAL arg)
22 continue()
23 endif(CMAKE_ARGC EQUAL arg)
24
25 if(REACHED_LIBS)
26 list(APPEND LIBS "${CMAKE_ARGV${arg}} ")
27 else(REACHED_LIBS)
28 list(APPEND OBJECT_FILES "${CMAKE_ARGV${arg}}")
29 endif(REACHED_LIBS)
30endforeach(arg RANGE 5 ${CMAKE_ARGC})
31
32file(WRITE dummylib.adb
33 "procedure dummylib is\n"
34 "begin\n"
35 " null;\n"
36 "end;\n")
37
38execute_process(COMMAND ${CMAKE_ARGV3} compile -fPIC dummylib.adb
39 OUTPUT_VARIABLE dont_care
40 ERROR_VARIABLE ERROR)
41execute_process(COMMAND ${CMAKE_ARGV3} bind -n dummylib.ali
42 OUTPUT_VARIABLE dont_care
43 ERROR_VARIABLE ERROR)
44
45execute_process(COMMAND ${CMAKE_ARGV3} link -shared dummylib.ali -o ${CMAKE_ARGV4} ${OBJECT_FILES} ${LIBS}
46 RESULT_VARIABLE RESULT
47 OUTPUT_VARIABLE dont_care
48 ERROR_VARIABLE ERROR)
49
50if(RESULT)
51 message(FATAL_ERROR ${RESULT} ${ERROR})
52endif(RESULT)
diff --git a/contrib/ada/cmake/static_link_helper.cmake b/contrib/ada/cmake/static_link_helper.cmake
new file mode 100644
index 00000000..eb3ff2bb
--- /dev/null
+++ b/contrib/ada/cmake/static_link_helper.cmake
@@ -0,0 +1,25 @@
1#CMAKE_ARGV0 = /path/to/cmake
2#CMAKE_ARGV1 = -P
3#CMAKE_ARGV2 = path/to/this/file
4#CMAKE_ARGV3 = path/to/ar
5#CMAKE_ARGV4 = output-name
6#CMAKE_ARGV5...CMAKE_AGVN = OBJECTS
7
8if(NOT CMAKE_ARGV3)
9 message(FATAL_ERROR "linker not set")
10endif(NOT CMAKE_ARGV3)
11
12foreach(arg RANGE 5 ${CMAKE_ARGC})
13 if(NOT CMAKE_ARGC EQUAL arg)
14 list(APPEND OBJECT_FILES "${CMAKE_ARGV${arg}}")
15 endif(NOT CMAKE_ARGC EQUAL arg)
16endforeach(arg RANGE 6 ${CMAKE_ARGC})
17
18execute_process(COMMAND ${CMAKE_ARGV3} rcs ${CMAKE_ARGV4} ${OBJECT_FILES}
19 RESULT_VARIABLE RESULT
20 OUTPUT_VARIABLE dont_care
21 ERROR_VARIABLE ERROR)
22
23if(RESULT)
24 message(FATAL_ERROR ${RESULT} ${ERROR})
25endif(RESULT)