1# This file is part of the Spring engine (GPL v2 or later), see LICENSE.html
2
3#
4# Spring Java related CMake utilities
5# -----------------------------------
6#
7# Variables set in this file:
8# * JAVA_GLOBAL_LIBS_DIRS
9#
10# Functions and macros defined in this file:
11# * FindJavaLib
12# * GetFirstSubDirName
13# * CreateClasspath
14# * ConcatClasspaths
15# * IsMavenProject
16# * FindManifestFile
17#
18
19
20if     (CMAKE_HOST_WIN32)
21	set(JAVA_GLOBAL_LIBS_DIRS "${MINGWLIBS}")
22else   (CMAKE_HOST_WIN32)
23	set(JAVA_GLOBAL_LIBS_DIRS "/usr/share/java" "/usr/local/share/java")
24endif  (CMAKE_HOST_WIN32)
25MakeGlobal(JAVA_GLOBAL_LIBS_DIRS)
26
27
28# Looks for a Java library (Jar file) in system wide search paths and in
29# additional dirs supplied as argument.
30macro    (FindJavaLib path_var libName additionalSearchDirs)
31	find_file(${path_var} "${libName}.jar"
32		PATHS ${additionalSearchDirs} ${JAVA_GLOBAL_LIBS_DIRS}
33		DOC "Path to the Java library ${libName}.jar"
34		NO_DEFAULT_PATH
35		NO_CMAKE_FIND_ROOT_PATH
36		)
37	if    (NOT ${path_var})
38		message(SEND_ERROR "${libName}.jar not found!")
39	else  (NOT ${path_var})
40		AIMessage(STATUS "Found ${libName}.jar: ${${path_var}}")
41	endif (NOT ${path_var})
42endmacro (FindJavaLib path_var libName additionalSearchDirs)
43
44
45# Returns the name of the first sub-dir (in alphabetical descending order)
46# under dir.
47macro    (GetFirstSubDirName name_var dir)
48	file(GLOB dirContent RELATIVE "${dir}" "${dir}/*")
49	foreach    (dirPart ${dirContent})
50		if    (IS_DIRECTORY "${dir}/${dirPart}")
51			set(${name_var} ${dirPart})
52			break()
53		endif (IS_DIRECTORY "${dir}/${dirPart}")
54	endforeach (dirPart)
55endmacro (GetFirstSubDirName name_var dir)
56
57
58# Recursively lists all JAR files in a given directory
59# and concatenates them in a Java Classpath compatible way into a single string.
60macro    (CreateClasspath classPath_var dir)
61	file(GLOB_RECURSE ${classPath_var} FOLLOW_SYMLINKS "${dir}/*.jar")
62	# Make sure we use the correct path delimitter for the compiling system
63	string(REPLACE ";" "${PATH_DELIM_H}" ${classPath_var} "${${classPath_var}}")
64endmacro (CreateClasspath classPath_var dir)
65
66
67# Concatenates an arbritrary number of Java ClassPaths (may be empty).
68function    (ConcatClasspaths resultingCP_var)
69	set(${resultingCP_var} "")
70	foreach    (cpPart ${ARGN})
71		set(${resultingCP_var} "${${resultingCP_var}}${cpPart}${PATH_DELIM_H}")
72	endforeach (cpPart)
73	string(REGEX REPLACE "${PATH_DELIM_H}\$" "" ${resultingCP_var} "${${resultingCP_var}}")
74	set(${resultingCP_var} "${${resultingCP_var}}" PARENT_SCOPE)
75endfunction (ConcatClasspaths)
76
77
78# Checks if a given directory is the root of a Maven project.
79# The result variable will be set to TRUE or FALSE
80function    (IsMavenProject dirToCheck result_var)
81	set(${result_var} FALSE)
82	if    (EXISTS "${dirToCheck}/pom.xml")
83		set(${result_var} TRUE)
84	endif (EXISTS "${dirToCheck}/pom.xml")
85	set(${result_var} "${${result_var}}" PARENT_SCOPE)
86endfunction (IsMavenProject)
87
88
89# Look for a manifest.mf file in a few specific sub-dirs.
90# This could be done with a simple find_file call,
91# but that strangely does not find the file under win32,
92# so we use this workaround
93function    (FindManifestFile srcDir result_var)
94	set(manifestSubdirs
95		"/src/main/resources/META-INF/"
96		"/src/"
97		"/")
98	set(${result_var} "${result_var}-NOTFOUND")
99	if     (CMAKE_HOST_WIN32)
100		foreach(subDir_var ${manifestSubdirs})
101			if     (EXISTS "${srcDir}${subDir_var}manifest.mf")
102				set(${result_var} "${srcDir}${subDir_var}manifest.mf")
103				break()
104			endif  (EXISTS "${srcDir}${subDir_var}manifest.mf")
105		endforeach(subDir_var)
106	else   (CMAKE_HOST_WIN32)
107		find_file(${result_var}
108			NAMES "manifest.mf" "MANIFEST.MF"
109			PATHS "${srcDir}"
110			PATH_SUFFIXES ${manifestSubdirs}
111			NO_DEFAULT_PATH)
112	endif  (CMAKE_HOST_WIN32)
113	set(${result_var} ${${result_var}} PARENT_SCOPE)
114endfunction (FindManifestFile)
115
116