changeset 181:b426da0c9720

CMake: New option D_MODULES_PER_OBJECT. Max number of modules per object file.
author SokoL_SD
date Fri, 03 Jul 2009 14:25:58 +0000
parents 39921f499a22
children 973564c7e388
files cmake/FindD.cmake
diffstat 1 files changed, 51 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/cmake/FindD.cmake	Thu Jul 02 12:04:40 2009 +0000
+++ b/cmake/FindD.cmake	Fri Jul 03 14:25:58 2009 +0000
@@ -64,9 +64,10 @@
 	set(opt_tmp "OFF")
     endif(D_IS_MARS)   
     option(SINGLE_D_OBJECT "Build all d sources to one object file" ${opt_tmp})
-    if(SINGLE_D_OBJECT AND D_IS_LLVM)
+    if(D_IS_LLVM)
 	set(D_FLAGS ${D_FLAGS} -singleobj)
-    endif(SINGLE_D_OBJECT AND D_IS_LLVM)
+    endif(D_IS_LLVM)
+    set(D_MODULES_PER_OBJECT 10000 CACHE STRING "Max number of modules per object file")
 endif(NOT ONE_BUILD_COMMAND)
 
 ## Specifics flags for build configurations.
@@ -209,29 +210,54 @@
 		    )
 	endforeach (d_source_p_tmp ${SOURCES_tmp})
     else(NOT SINGLE_D_OBJECT)
-	set(object_tmp ${tmp_dir_tmp}/${target}${D_OBJECT_SUFFIX})
-	set(d_obj_out_tmp ${${objects_list}})
-	obj_path(d_obj_out_tmp)
-	set(parameters_tmp ${FLAGS_tmp} -c ${SOURCES_tmp} -of${object_tmp})
-	set(parameters_list_file_tmp ${tmp_dir_tmp}/parameters_obj)
-	if(CMAKE_HOST_WIN32)	
-	    file(REMOVE ${parameters_list_file_tmp})
-	    foreach(arg_tmp ${parameters_tmp})
-		file(APPEND ${parameters_list_file_tmp} "${arg_tmp}\n")
-	    endforeach(arg_tmp)
-	    set(param_tmp @${parameters_list_file_tmp})
-	elseif(CMAKE_HOST_UNIX)
-	    set(param_tmp ${parameters_tmp})
-	endif(CMAKE_HOST_WIN32)
-	#get_imported_files(depends_tmp ${ARGN})
-	add_custom_command(OUTPUT "${object_tmp}"
-			COMMAND "${DC}"
-			ARGS ${param_tmp}
-			WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-			DEPENDS ${SOURCES_tmp} ${depends_tmp}
-			COMMENT ""
-		    )
-	set(${objects_list} ${object_tmp})
+	set(count_objects_tmp 0)
+	set(files${count_objects_tmp}_tmp )
+	set(counter_tmp 0)
+	set(files_tmp )
+	set(objects_tmp )
+	foreach (d_source_p_tmp ${SOURCES_tmp})
+	    math(EXPR counter_tmp "${counter_tmp} + 1")
+	    set(files${count_objects_tmp}_tmp ${files${count_objects_tmp}_tmp} ${d_source_p_tmp})
+	    if(counter_tmp GREATER D_MODULES_PER_OBJECT)
+		math(EXPR count_objects_tmp "${count_objects_tmp} + 1")
+		set(files${count_objects_tmp}_tmp )
+		set(counter_tmp 0)
+	    endif(counter_tmp GREATER D_MODULES_PER_OBJECT)
+	endforeach (d_source_p_tmp ${SOURCES_tmp})
+
+	if(files${count_objects_tmp}_tmp)
+	    math(EXPR count_objects_tmp "${count_objects_tmp} + 1")
+	endif(files${count_objects_tmp}_tmp)
+
+	set(id_tmp 0)
+	while(id_tmp LESS ${count_objects_tmp})
+	    set(object_tmp ${tmp_dir_tmp}/${target}${id_tmp}${D_OBJECT_SUFFIX})
+	    set(d_obj_out_tmp ${${object_tmp}})
+	    obj_path(d_obj_out_tmp)
+	    set(parameters_tmp ${FLAGS_tmp} -c ${files${id_tmp}_tmp} -of${object_tmp})
+	    set(parameters_list_file_tmp ${tmp_dir_tmp}/parameters${id_tmp}_obj)
+	    if(CMAKE_HOST_WIN32)	
+		file(REMOVE ${parameters_list_file_tmp})
+		foreach(arg_tmp ${parameters_tmp})
+		    file(APPEND ${parameters_list_file_tmp} "${arg_tmp}\n")
+		endforeach(arg_tmp)
+		set(param_tmp @${parameters_list_file_tmp})
+	    elseif(CMAKE_HOST_UNIX)
+		set(param_tmp ${parameters_tmp})
+	    endif(CMAKE_HOST_WIN32)
+	    #get_imported_files(depends_tmp ${ARGN})
+	    add_custom_command(OUTPUT "${object_tmp}"
+			    COMMAND "${DC}"
+			    ARGS ${param_tmp}
+			    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+			    DEPENDS ${files${id_tmp}_tmp} ${depends_tmp}
+			    COMMENT ""
+			)
+	    set(objects_tmp ${objects_tmp} ${object_tmp})
+	    math(EXPR id_tmp "${id_tmp} + 1")
+	endwhile(id_tmp LESS ${count_objects_tmp})
+
+	set(${objects_list} ${objects_tmp})
     endif(NOT SINGLE_D_OBJECT)
     #add_custom_target(${target} DEPENDS "${${objects_list}}")
 endmacro(compile_d_files objects_list)