Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

added script to double check cmake files (copied from blender where I…

… maintain it),

this helps ensure all source files are either explicitly ignored or accounted for by cmake.
very nice for generating project files.
  • Loading branch information...
commit 27fe9528a5b2bc2cc7b0c957a5e107b2b7ccfa0d 1 parent 46fb782
@ideasman42 ideasman42 authored
View
12 CMakeLists.txt
@@ -56,11 +56,11 @@ macro(opencollada_add_lib
set_target_properties(${name}_static PROPERTIES OUTPUT_NAME ${name})
target_link_libraries(${name}_static ${target_libs})
set(CMAKE_REQUIRED_LIBRARIES "${name}_static;${CMAKE_REQUIRED_LIBRARIES}" PARENT_SCOPE)
-
+
install(
TARGETS ${name}_static
ARCHIVE DESTINATION ${OPENCOLLADA_INST_LIBRARY}
- )
+ )
endif ()
if (USE_SHARED)
@@ -86,8 +86,8 @@ endmacro()
project(OPENCOLLADA) # must be after setting cmake_configuration_types
# defines where specific parts of BRICS_MM are stored or created
-set(LIBRARY_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/lib) # static libraries
-set(EXECUTABLE_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/bin) # executables
+set(LIBRARY_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/lib) # static libraries
+set(EXECUTABLE_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/bin) # executables
set(EXTERNAL_LIBRARIES ${CMAKE_HOME_DIRECTORY}/Externals) # external libraries
set(CMAKE_MODULE_PATH "${EXTERNAL_LIBRARIES}/cmake-modules")
@@ -131,7 +131,7 @@ if (USE_LIBXML)
message("WARNING: Native LibXml2 not found, taking LibXml from ./Externals")
add_subdirectory(${EXTERNAL_LIBRARIES}/LibXML)
set(LIBXML2_INCLUDE_DIR
- ${libxml_include_dirs}
+ ${libxml_include_dirs}
)
set(LIBXML2_LIBRARIES xml)
else ()
@@ -164,7 +164,7 @@ endif ()
# building required libs
add_subdirectory(common/libftoa)
-add_subdirectory(common/libBuffer)
+add_subdirectory(common/libBuffer)
add_subdirectory(${EXTERNAL_LIBRARIES}/UTF)
add_subdirectory(${EXTERNAL_LIBRARIES}/MathMLSolver)
View
72 COLLADASaxFrameworkLoader/CMakeLists.txt
@@ -84,6 +84,60 @@ set(INST_SRC
include/COLLADASaxFWLXmlTypes.h
)
+set(INST_GEN14_SRC
+ include/generated14/COLLADASaxFWLAssetLoader14.h
+ include/generated14/COLLADASaxFWLColladaParserAutoGen14.h
+ include/generated14/COLLADASaxFWLColladaParserAutoGen14Attributes.h
+ include/generated14/COLLADASaxFWLColladaParserAutoGen14Enums.h
+ include/generated14/COLLADASaxFWLColladaParserAutoGen14FunctionMapFactory.h
+ include/generated14/COLLADASaxFWLColladaParserAutoGen14Private.h
+ include/generated14/COLLADASaxFWLColladaParserAutoGen14ValidationData.h
+ include/generated14/COLLADASaxFWLGeometryLoader14.h
+ include/generated14/COLLADASaxFWLLibraryAnimationsLoader14.h
+ include/generated14/COLLADASaxFWLLibraryCamerasLoader14.h
+ include/generated14/COLLADASaxFWLLibraryControllersLoader14.h
+ include/generated14/COLLADASaxFWLLibraryEffectsLoader14.h
+ include/generated14/COLLADASaxFWLLibraryImagesLoader14.h
+ include/generated14/COLLADASaxFWLLibraryLightsLoader14.h
+ include/generated14/COLLADASaxFWLLibraryMaterialsLoader14.h
+ include/generated14/COLLADASaxFWLLibraryNodesLoader14.h
+ include/generated14/COLLADASaxFWLMeshLoader14.h
+ include/generated14/COLLADASaxFWLNodeLoader14.h
+ include/generated14/COLLADASaxFWLSceneLoader14.h
+ include/generated14/COLLADASaxFWLSourceArrayLoader14.h
+ include/generated14/COLLADASaxFWLVisualSceneLoader14.h
+)
+
+set(INST_GEN15_SRC
+ include/generated15/COLLADASaxFWLAssetLoader15.h
+ include/generated15/COLLADASaxFWLColladaParserAutoGen15.h
+ include/generated15/COLLADASaxFWLColladaParserAutoGen15Attributes.h
+ include/generated15/COLLADASaxFWLColladaParserAutoGen15Enums.h
+ include/generated15/COLLADASaxFWLColladaParserAutoGen15FunctionMapFactory.h
+ include/generated15/COLLADASaxFWLColladaParserAutoGen15Private.h
+ include/generated15/COLLADASaxFWLColladaParserAutoGen15ValidationData.h
+ include/generated15/COLLADASaxFWLFormulasLoader15.h
+ include/generated15/COLLADASaxFWLGeometryLoader15.h
+ include/generated15/COLLADASaxFWLLibraryAnimationsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryArticulatedSystemsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryCamerasLoader15.h
+ include/generated15/COLLADASaxFWLLibraryControllersLoader15.h
+ include/generated15/COLLADASaxFWLLibraryEffectsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryFormulasLoader15.h
+ include/generated15/COLLADASaxFWLLibraryImagesLoader15.h
+ include/generated15/COLLADASaxFWLLibraryJointsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryKinematicsModelsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryKinematicsScenesLoader15.h
+ include/generated15/COLLADASaxFWLLibraryLightsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryMaterialsLoader15.h
+ include/generated15/COLLADASaxFWLLibraryNodesLoader15.h
+ include/generated15/COLLADASaxFWLMeshLoader15.h
+ include/generated15/COLLADASaxFWLNodeLoader15.h
+ include/generated15/COLLADASaxFWLSceneLoader15.h
+ include/generated15/COLLADASaxFWLSourceArrayLoader15.h
+ include/generated15/COLLADASaxFWLVisualSceneLoader15.h
+)
+
set(SRC
src/COLLADASaxFWLLibraryArticulatedSystemsLoader.cpp
src/COLLADASaxFWLCOLLADACsymbol.cpp
@@ -194,6 +248,8 @@ set(SRC
src/generated15/COLLADASaxFWLLibraryControllersLoader15.cpp
${INST_SRC}
+ ${INST_GEN14_SRC}
+ ${INST_GEN15_SRC}
)
set(TARGET_LIBS
@@ -229,19 +285,11 @@ install(
FILES ${INST_SRC}
DESTINATION ${OPENCOLLADA_INST_INCLUDE}/COLLADASaxFrameworkLoader
)
-
-# HRMF, these should be in INST_SRC really! - campbell
install(
- DIRECTORY
- include/generated14
- DESTINATION
- ${OPENCOLLADA_INST_INCLUDE}/COLLADASaxFrameworkLoader
- PATTERN ".svn" EXCLUDE
+ FILES ${INST_GEN14_SRC}
+ DESTINATION ${OPENCOLLADA_INST_INCLUDE}/COLLADASaxFrameworkLoader/generated14
)
install(
- DIRECTORY
- include/generated15
- DESTINATION
- ${OPENCOLLADA_INST_INCLUDE}/COLLADASaxFrameworkLoader
- PATTERN ".svn" EXCLUDE
+ FILES ${INST_GEN15_SRC}
+ DESTINATION ${OPENCOLLADA_INST_INCLUDE}/COLLADASaxFrameworkLoader/generated15
)
View
3  COLLADAValidator/CMakeLists.txt
@@ -10,6 +10,9 @@ set(libValidator_include_dirs ${libValidator_include_dirs} PARENT_SCOPE) # addi
set(SRC
src/main.cpp
src/ValidationErrorHandler.cpp
+
+ include/ValidationErrorHandler.h
+ include/Writer.h
)
set(libValidator_libs
View
27 Externals/MathMLSolver/CMakeLists.txt
@@ -25,6 +25,33 @@ set(SRC
src/MathMLSerializationVisitor.cpp
src/MathMLSerializationUtil.cpp
src/MathMLString.cpp
+
+ include/AST/MathMLASTArithmeticExpression.h
+ include/AST/MathMLASTBinaryComparisionExpression.h
+ include/AST/MathMLASTConstantExpression.h
+ include/AST/MathMLASTFragmentExpression.h
+ include/AST/MathMLASTFunctionExpression.h
+ include/AST/MathMLASTLogicExpression.h
+ include/AST/MathMLASTNode.h
+ include/AST/MathMLASTStringVisitor.h
+ include/AST/MathMLASTUnaryArithmeticExpression.h
+ include/AST/MathMLASTVariableExpression.h
+ include/AST/MathMLASTVisitor.h
+ include/MathMLError.h
+ include/MathMLEvaluatorVisitor.h
+ include/MathMLParser.h
+ include/MathMLParserConstants.h
+ include/MathMLPlatform.h
+ include/MathMLSerializationUtil.h
+ include/MathMLSerializationVisitor.h
+ include/MathMLSingleton.h
+ include/MathMLSolverFunctionExtensions.h
+ include/MathMLSolverPrerequisites.h
+ include/MathMLSolverStableHeaders.h
+ include/MathMLStreamParser.h
+ include/MathMLStreamParserHandler.h
+ include/MathMLString.h
+ include/MathMLSymbolTable.h
)
set(TARGET_LIBS)
View
2  Externals/UTF/CMakeLists.txt
@@ -9,6 +9,8 @@ set(libUTF_include_dirs ${libUTF_include_dirs} PARENT_SCOPE) # adding include d
set(SRC
src/ConvertUTF.c
+
+ include/ConvertUTF.h
)
set(TARGET_LIBS)
View
18 Externals/pcre/CMakeLists.txt
@@ -15,8 +15,26 @@ set(SRC
src/pcre_newline.c
src/pcre_tables.c
src/pcre_try_flipped.c
+
+ include/pcre.h
+ include/pcre_internal.h
+ include/ucp.h
)
+if (WIN32)
+ list(APPEND SRC
+ include/config_win.h
+ )
+else if (APPLE)
+ list(APPEND SRC
+ include/config_mac.h
+ )
+else () # *nix
+ list(APPEND SRC
+ include/config_linux.h
+ )
+endif()
+
set(libpcre_libs)
include_directories(
View
24 GeneratedSaxParser/CMakeLists.txt
@@ -51,15 +51,27 @@ set(TARGET_LIBS
)
if (USE_LIBXML)
- list(APPEND SRC src/GeneratedSaxParserLibxmlSaxParser.cpp)
- list(APPEND libGeneratedSaxParser_include_dirs ${LIBXML2_INCLUDE_DIR})
- list(APPEND TARGET_LIBS ${LIBXML2_LIBRARIES})
+ list(APPEND SRC
+ src/GeneratedSaxParserLibxmlSaxParser.cpp
+ )
+ list(APPEND libGeneratedSaxParser_include_dirs
+ ${LIBXML2_INCLUDE_DIR}
+ )
+ list(APPEND TARGET_LIBS
+ ${LIBXML2_LIBRARIES}
+ )
endif ()
if (USE_EXPAT)
- list(APPEND SRC src/GeneratedSaxParserExpatSaxParser.cpp)
- list(APPEND libGeneratedSaxParser_include_dirs ${LIBEXPAT_INCLUDE_DIR})
- list(APPEND TARGET_LIBS ${LIBEXPAT_LIBRARIES})
+ list(APPEND SRC
+ src/GeneratedSaxParserExpatSaxParser.cpp
+ )
+ list(APPEND libGeneratedSaxParser_include_dirs
+ ${LIBEXPAT_INCLUDE_DIR}
+ )
+ list(APPEND TARGET_LIBS
+ ${LIBEXPAT_LIBRARIES}
+ )
endif ()
include_directories(
View
9 common/libBuffer/CMakeLists.txt
@@ -17,6 +17,15 @@ set(SRC
src/CommonCharacterBuffer.cpp
src/CommonFWriteBufferFlusher.cpp
src/CommonStreamBufferFlusher.cpp
+ # src/CommonLogFileBufferFlusher.cpp
+
+ include/CommonBuffer.h
+ include/CommonCharacterBuffer.h
+ include/CommonFWriteBufferFlusher.h
+ include/CommonIBufferFlusher.h
+ include/CommonLogFileBufferFlusher.h
+ include/CommonStreamBufferFlusher.h
+ include/performanceTest/performanceTest.h
)
set(TARGET_LIBS ftoa)
View
4 common/libftoa/CMakeLists.txt
@@ -11,6 +11,10 @@ set(SRC
src/Commondtoa.cpp
src/Commonftoa.cpp
src/Commonitoa.cpp
+
+ include/Commondtoa.h
+ include/Commonftoa.h
+ include/Commonitoa.h
)
set(TARGET_LIBS)
View
297 scripts/cmake_consistency_check.py
@@ -0,0 +1,297 @@
+#!/usr/bin/env python
+
+# $Id: cmake_consistency_check.py 38869 2011-07-31 03:15:37Z campbellbarton $
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Contributor(s): Campbell Barton
+#
+# ***** END GPL LICENSE BLOCK *****
+
+# <pep8 compliant>
+
+from cmake_consistency_check_config import IGNORE, UTF8_CHECK, SOURCE_DIR
+
+import os
+from os.path import join, dirname, normpath, splitext
+
+print("Scanning:", SOURCE_DIR)
+
+global_h = set()
+global_c = set()
+global_refs = {}
+
+
+def replace_line(f, i, text, keep_indent=True):
+ file_handle = open(f, 'r')
+ data = file_handle.readlines()
+ file_handle.close()
+
+ l = data[i]
+ ws = l[:len(l) - len(l.lstrip())]
+
+ data[i] = "%s%s\n" % (ws, text)
+
+ file_handle = open(f, 'w')
+ file_handle.writelines(data)
+ file_handle.close()
+
+
+def source_list(path, filename_check=None):
+ for dirpath, dirnames, filenames in os.walk(path):
+
+ # skip '.svn'
+ if dirpath.startswith("."):
+ continue
+
+ for filename in filenames:
+ if filename_check is None or filename_check(filename):
+ yield os.path.join(dirpath, filename)
+
+
+# extension checking
+def is_cmake(filename):
+ ext = splitext(filename)[1]
+ return (ext == ".cmake") or (filename == "CMakeLists.txt")
+
+
+def is_c_header(filename):
+ ext = splitext(filename)[1]
+ return (ext in (".h", ".hpp", ".hxx"))
+
+
+def is_c(filename):
+ ext = splitext(filename)[1]
+ return (ext in (".c", ".cpp", ".cxx", ".m", ".mm", ".rc"))
+
+
+def is_c_any(filename):
+ return is_c(filename) or is_c_header(filename)
+
+
+def cmake_get_src(f):
+
+ sources_h = []
+ sources_c = []
+
+ filen = open(f, "r", encoding="utf8")
+ it = iter(filen)
+ found = False
+ i = 0
+ # print(f)
+
+ def is_definition(l, f, i, name):
+ if ('set(%s' % name) in l or ('set(' in l and l.endswith(name)):
+ if len(l.split()) > 1:
+ raise Exception("strict formatting not kept 'set(%s*' %s:%d" % (name, f, i))
+ return True
+
+ if ("list(APPEND %s" % name) in l or ('list(APPEND ' in l and l.endswith(name)):
+ if l.endswith(")"):
+ raise Exception("strict formatting not kept 'list(APPEND %s...)' on 1 line %s:%d" % (name, f, i))
+ return True
+
+ while it is not None:
+ context_name = ""
+ while it is not None:
+ i += 1
+ try:
+ l = next(it)
+ except StopIteration:
+ it = None
+ break
+ l = l.strip()
+ if not l.startswith("#"):
+ found = is_definition(l, f, i, "SRC")
+ if found:
+ context_name = "SRC"
+ break
+ found = is_definition(l, f, i, "INC")
+ if found:
+ context_name = "INC"
+ break
+
+ if found:
+ cmake_base = dirname(f)
+
+ while it is not None:
+ i += 1
+ try:
+ l = next(it)
+ except StopIteration:
+ it = None
+ break
+
+ l = l.strip()
+
+ if not l.startswith("#"):
+
+ if ")" in l:
+ if l.strip() != ")":
+ raise Exception("strict formatting not kept '*)' %s:%d" % (f, i))
+ break
+
+ # replace dirs
+ l = l.replace("${CMAKE_CURRENT_SOURCE_DIR}", cmake_base)
+
+ if not l:
+ pass
+ elif l.startswith("$"):
+ if context_name == "SRC":
+ # assume if it ends with context_name we know about it
+ if not l.split("}")[0].endswith(context_name):
+ print("Can't use var '%s' %s:%d" % (l, f, i))
+ elif len(l.split()) > 1:
+ raise Exception("Multi-line define '%s' %s:%d" % (l, f, i))
+ else:
+ new_file = normpath(join(cmake_base, l))
+
+ if context_name == "SRC":
+ if is_c_header(new_file):
+ sources_h.append(new_file)
+ global_refs.setdefault(new_file, []).append((f, i))
+ elif is_c(new_file):
+ sources_c.append(new_file)
+ global_refs.setdefault(new_file, []).append((f, i))
+ elif l in ("PARENT_SCOPE", ):
+ # cmake var, ignore
+ pass
+ elif new_file.endswith(".list"):
+ pass
+ elif new_file.endswith(".def"):
+ pass
+ else:
+ raise Exception("unknown file type - not c or h %s -> %s" % (f, new_file))
+
+ elif context_name == "INC":
+ if os.path.isdir(new_file):
+ new_path_rel = os.path.relpath(new_file, cmake_base)
+
+ if new_path_rel != l:
+ print("overly relative path:\n %s:%d\n %s\n %s" % (f, i, l, new_path_rel))
+
+ ## Save time. just replace the line
+ # replace_line(f, i - 1, new_path_rel)
+
+ else:
+ raise Exception("non existant include %s:%d -> %s" % (f, i, new_file))
+
+ # print(new_file)
+
+ global_h.update(set(sources_h))
+ global_c.update(set(sources_c))
+ '''
+ if not sources_h and not sources_c:
+ raise Exception("No sources %s" % f)
+
+ sources_h_fs = list(source_list(cmake_base, is_c_header))
+ sources_c_fs = list(source_list(cmake_base, is_c))
+ '''
+ # find missing C files:
+ '''
+ for ff in sources_c_fs:
+ if ff not in sources_c:
+ print(" missing: " + ff)
+ '''
+
+ # reset
+ sources_h[:] = []
+ sources_c[:] = []
+
+ filen.close()
+
+
+for cmake in source_list(SOURCE_DIR, is_cmake):
+ cmake_get_src(cmake)
+
+
+def is_ignore(f):
+ for ig in IGNORE:
+ if ig in f:
+ return True
+ return False
+
+
+# First do stupid check, do these files exist?
+print("\nChecking for missing references:")
+is_err = False
+errs = []
+for f in (global_h | global_c):
+ if f.endswith("dna.c"):
+ continue
+
+ if not os.path.exists(f):
+ refs = global_refs[f]
+ if refs:
+ for cf, i in refs:
+ errs.append((cf, i))
+ else:
+ raise Exception("CMake referenecs missing, internal error, aborting!")
+ is_err = True
+
+errs.sort()
+errs.reverse()
+for cf, i in errs:
+ print("%s:%d" % (cf, i))
+ # Write a 'sed' script, useful if we get a lot of these
+ # print("sed '%dd' '%s' > '%s.tmp' ; mv '%s.tmp' '%s'" % (i, cf, cf, cf, cf))
+
+
+if is_err:
+ raise Exception("CMake referenecs missing files, aborting!")
+del is_err
+del errs
+
+# now check on files not accounted for.
+print("\nC/C++ Files CMake doesnt know about...")
+for cf in sorted(source_list(SOURCE_DIR, is_c)):
+ if not is_ignore(cf):
+ if cf not in global_c:
+ print("missing_c: ", cf)
+
+ # check if automake builds a corrasponding .o file.
+ '''
+ if cf in global_c:
+ out1 = os.path.splitext(cf)[0] + ".o"
+ out2 = os.path.splitext(cf)[0] + ".Po"
+ out2_dir, out2_file = out2 = os.path.split(out2)
+ out2 = os.path.join(out2_dir, ".deps", out2_file)
+ if not os.path.exists(out1) and not os.path.exists(out2):
+ print("bad_c: ", cf)
+ '''
+
+print("\nC/C++ Headers CMake doesnt know about...")
+for hf in sorted(source_list(SOURCE_DIR, is_c_header)):
+ if not is_ignore(hf):
+ if hf not in global_h:
+ print("missing_h: ", hf)
+
+if UTF8_CHECK:
+ # test encoding
+ import traceback
+ for files in (global_c, global_h):
+ for f in sorted(files):
+ if os.path.exists(f):
+ # ignore outside of our source tree
+ if "extern" not in f:
+ i = 1
+ try:
+ for l in open(f, "r", encoding="utf8"):
+ i += 1
+ except:
+ print("Non utf8: %s:%d" % (f, i))
+ if i > 1:
+ traceback.print_exc()
View
53 scripts/cmake_consistency_check_config.py
@@ -0,0 +1,53 @@
+import os
+
+IGNORE = (
+ "/COLLADAMax/",
+ "/COLLADAMaya/",
+ "/G3DWarehouseBrowser/",
+ "/dae2ma/",
+ "/dae2ogre/",
+ "/dae23ds_lib3ds/",
+ "/dae23ds/",
+ "/common/libftoa/include/unitTest/",
+ "/common/libftoa/include/performanceTest/",
+
+ # externals
+ "/Externals/zziplib/",
+ "/Externals/zlib/",
+ "/Externals/expat/",
+ "/Externals/MayaDataModel/",
+ "/Externals/Cg/",
+ "/Externals/LibXML/",
+
+ # specific source files
+ "common/libftoa/include/itoaUnitTest.h",
+ "dae2ogre/template/template.h",
+ "COLLADABaseUtils/template/template.h",
+ "COLLADAFramework/template/template.h",
+ "COLLADAMax/template/template.h",
+ "COLLADAMaya/template/template.h",
+ "COLLADASaxFrameworkLoader/template/template.h",
+ "COLLADAStreamWriter/template/template.h",
+ "GeneratedSaxParser/template/template.h",
+ "dae23ds/template/template.h",
+ "dae2ma/template/template.h",
+
+ "COLLADABaseUtils/template/template.cpp",
+ "COLLADAFramework/template/template.cpp",
+ "COLLADASaxFrameworkLoader/template/template.cpp",
+ "COLLADAStreamWriter/template/template.cpp",
+ "GeneratedSaxParser/template/template.cpp",
+ "common/libBuffer/src/performanceTest/main.cpp",
+ "common/libBuffer/src/performanceTest/performanceTest.cpp",
+ "common/libBuffer/src/unitTest/main.cpp",
+ "common/libftoa/src/itoaUnitTest.cpp",
+ "common/libftoa/src/performanceTest/main.cpp",
+ "common/libftoa/src/performanceTest/performanceTest.cpp",
+ "common/libftoa/src/unitTest/dtoaUnitTest.cpp",
+ "common/libftoa/src/unitTest/ftoaUnitTest.cpp",
+ "common/libftoa/src/unitTest/main.cpp",
+ )
+
+UTF8_CHECK = False
+
+SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file__), ".."))))
Please sign in to comment.
Something went wrong with that request. Please try again.