Skip to content

Commit afa45fe

Browse files
SibiSiddharthangitster
authored andcommitted
cmake: generate the shell/perl/python scripts and templates, translations
Implement the placeholder substitution to generate scripted Porcelain commands, e.g. git-request-pull out of git-request-pull.sh Generate shell/perl/python scripts and template using CMake instead of using sed like the build procedure in the Makefile does. The text translations are only build if `msgfmt` is found in your path. NOTE: The scripts and templates are generated during configuration. Signed-off-by: Sibi Siddharthan <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 061c224 commit afa45fe

File tree

1 file changed

+110
-1
lines changed

1 file changed

+110
-1
lines changed

contrib/buildsystems/CMakeLists.txt

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ project(git
6666
LANGUAGES C)
6767

6868

69-
#macros for parsing the Makefile for sources
69+
#macros for parsing the Makefile for sources and scripts
7070
macro(parse_makefile_for_sources list_var regex)
7171
file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+=(.*)")
7272
string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
@@ -77,6 +77,16 @@ macro(parse_makefile_for_sources list_var regex)
7777
list(REMOVE_ITEM ${list_var} "") #remove empty list elements
7878
endmacro()
7979

80+
macro(parse_makefile_for_scripts list_var regex lang)
81+
file(STRINGS ${CMAKE_SOURCE_DIR}/Makefile ${list_var} REGEX "^${regex} \\+=(.*)")
82+
string(REPLACE "${regex} +=" "" ${list_var} ${${list_var}})
83+
string(STRIP ${${list_var}} ${list_var}) #remove trailing/leading whitespaces
84+
string(REPLACE " " ";" ${list_var} ${${list_var}}) #convert string to a list
85+
if(NOT ${lang}) #exclude for SCRIPT_LIB
86+
list(TRANSFORM ${list_var} REPLACE "${lang}" "") #do the replacement
87+
endif()
88+
endmacro()
89+
8090
include(CheckTypeSize)
8191
include(CheckCSourceRuns)
8292
include(CheckCSourceCompiles)
@@ -112,6 +122,11 @@ if(Intl_FOUND)
112122
include_directories(SYSTEM ${Intl_INCLUDE_DIRS})
113123
endif()
114124

125+
find_program(MSGFMT_EXE msgfmt)
126+
if(NOT MSGFMT_EXE)
127+
message(WARNING "Text Translations won't be build")
128+
endif()
129+
115130
#default behaviour
116131
include_directories(${CMAKE_SOURCE_DIR})
117132
add_compile_definitions(GIT_HOST_CPU="${CMAKE_SYSTEM_PROCESSOR}")
@@ -590,3 +605,97 @@ add_custom_command(OUTPUT ${git_links} ${git_http_links}
590605
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/CreateLinks.cmake
591606
DEPENDS git git-remote-http)
592607
add_custom_target(git-links ALL DEPENDS ${git_links} ${git_http_links})
608+
609+
610+
#creating required scripts
611+
set(SHELL_PATH /bin/sh)
612+
set(PERL_PATH /usr/bin/perl)
613+
set(LOCALEDIR ${FALLBACK_RUNTIME_PREFIX}/share/locale)
614+
set(GITWEBDIR ${FALLBACK_RUNTIME_PREFIX}/share/locale)
615+
set(INSTLIBDIR ${FALLBACK_RUNTIME_PREFIX}/share/perl5)
616+
617+
#shell scripts
618+
parse_makefile_for_scripts(git_sh_scripts "SCRIPT_SH" ".sh")
619+
parse_makefile_for_scripts(git_shlib_scripts "SCRIPT_LIB" "")
620+
set(git_shell_scripts
621+
${git_sh_scripts} ${git_shlib_scripts} git-instaweb)
622+
623+
foreach(script ${git_shell_scripts})
624+
file(STRINGS ${CMAKE_SOURCE_DIR}/${script}.sh content NEWLINE_CONSUME)
625+
string(REPLACE "@SHELL_PATH@" "${SHELL_PATH}" content "${content}")
626+
string(REPLACE "@@DIFF@@" "diff" content "${content}")
627+
string(REPLACE "@LOCALEDIR@" "${LOCALEDIR}" content "${content}")
628+
string(REPLACE "@GITWEBDIR@" "${GITWEBDIR}" content "${content}")
629+
string(REPLACE "@@NO_CURL@@" "" content "${content}")
630+
string(REPLACE "@@USE_GETTEXT_SCHEME@@" "" content "${content}")
631+
string(REPLACE "# @@BROKEN_PATH_FIX@@" "" content "${content}")
632+
string(REPLACE "@@PERL@@" "${PERL_PATH}" content "${content}")
633+
string(REPLACE "@@SANE_TEXT_GREP@@" "-a" content "${content}")
634+
string(REPLACE "@@PAGER_ENV@@" "LESS=FRX LV=-c" content "${content}")
635+
file(WRITE ${CMAKE_BINARY_DIR}/${script} ${content})
636+
endforeach()
637+
638+
#perl scripts
639+
parse_makefile_for_scripts(git_perl_scripts "SCRIPT_PERL" ".perl")
640+
641+
#create perl header
642+
file(STRINGS ${CMAKE_SOURCE_DIR}/perl/header_templates/fixed_prefix.template.pl perl_header )
643+
string(REPLACE "@@PATHSEP@@" ":" perl_header "${perl_header}")
644+
string(REPLACE "@@INSTLIBDIR@@" "${INSTLIBDIR}" perl_header "${perl_header}")
645+
646+
foreach(script ${git_perl_scripts})
647+
file(STRINGS ${CMAKE_SOURCE_DIR}/${script}.perl content NEWLINE_CONSUME)
648+
string(REPLACE "#!/usr/bin/perl" "#!/usr/bin/perl\n${perl_header}\n" content "${content}")
649+
string(REPLACE "@@GIT_VERSION@@" "${PROJECT_VERSION}" content "${content}")
650+
file(WRITE ${CMAKE_BINARY_DIR}/${script} ${content})
651+
endforeach()
652+
653+
#python script
654+
file(STRINGS ${CMAKE_SOURCE_DIR}/git-p4.py content NEWLINE_CONSUME)
655+
string(REPLACE "#!/usr/bin/env python" "#!/usr/bin/python" content "${content}")
656+
file(WRITE ${CMAKE_BINARY_DIR}/git-p4 ${content})
657+
658+
#perl modules
659+
file(GLOB_RECURSE perl_modules "${CMAKE_SOURCE_DIR}/perl/*.pm")
660+
661+
foreach(pm ${perl_modules})
662+
string(REPLACE "${CMAKE_SOURCE_DIR}/perl/" "" file_path ${pm})
663+
file(STRINGS ${pm} content NEWLINE_CONSUME)
664+
string(REPLACE "@@LOCALEDIR@@" "${LOCALEDIR}" content "${content}")
665+
string(REPLACE "@@NO_PERL_CPAN_FALLBACKS@@" "" content "${content}")
666+
file(WRITE ${CMAKE_BINARY_DIR}/perl/build/lib/${file_path} ${content})
667+
#test-lib.sh requires perl/build/lib to be the build directory of perl modules
668+
endforeach()
669+
670+
671+
#templates
672+
file(GLOB templates "${CMAKE_SOURCE_DIR}/templates/*")
673+
list(TRANSFORM templates REPLACE "${CMAKE_SOURCE_DIR}/templates/" "")
674+
list(REMOVE_ITEM templates ".gitignore")
675+
list(REMOVE_ITEM templates "Makefile")
676+
list(REMOVE_ITEM templates "blt")# Prevents an error when reconfiguring for in source builds
677+
678+
list(REMOVE_ITEM templates "branches--")
679+
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/templates/blt/branches) #create branches
680+
681+
#templates have @.*@ replacement so use configure_file instead
682+
foreach(tm ${templates})
683+
string(REPLACE "--" "/" blt_tm ${tm})
684+
string(REPLACE "this" "" blt_tm ${blt_tm})# for this--
685+
configure_file(${CMAKE_SOURCE_DIR}/templates/${tm} ${CMAKE_BINARY_DIR}/templates/blt/${blt_tm} @ONLY)
686+
endforeach()
687+
688+
689+
#translations
690+
if(MSGFMT_EXE)
691+
file(GLOB po_files "${CMAKE_SOURCE_DIR}/po/*.po")
692+
list(TRANSFORM po_files REPLACE "${CMAKE_SOURCE_DIR}/po/" "")
693+
list(TRANSFORM po_files REPLACE ".po" "")
694+
foreach(po ${po_files})
695+
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/po/build/locale/${po}/LC_MESSAGES)
696+
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/po/build/locale/${po}/LC_MESSAGES/git.mo
697+
COMMAND ${MSGFMT_EXE} --check --statistics -o ${CMAKE_BINARY_DIR}/po/build/locale/${po}/LC_MESSAGES/git.mo ${CMAKE_SOURCE_DIR}/po/${po}.po)
698+
list(APPEND po_gen ${CMAKE_BINARY_DIR}/po/build/locale/${po}/LC_MESSAGES/git.mo)
699+
endforeach()
700+
add_custom_target(po-gen ALL DEPENDS ${po_gen})
701+
endif()

0 commit comments

Comments
 (0)